asynchronous与multithreading – 有没有区别?
asynchronous调用是否总是创build一个新的线程? 两者有什么区别?
asynchronous调用是否总是创build或使用新的线程?
维基百科说 :
在计算机编程中,asynchronous事件是独立于主程序stream程发生的事件。 asynchronous操作是在非阻塞scheme中执行的操作,允许主程序stream继续处理。
我知道asynchronous调用可以在单线程上完成吗? 这怎么可能?
这个问题太过笼统,不能回答。
在一般情况下,asynchronous调用不一定会创build一个新的线程。 这是实现它的一种方式,预先存在的线程池或外部进程是其他方式。 这在很大程度上取决于语言,对象模型(如果有的话)和运行时环境。
asynchronous只是意味着调用线程并不坐等待响应,asynchronous活动也不会在调用线程中发生。
除此之外,你将需要得到更具体的。
只要需要asynchronous执行的操作不需要CPU工作,就可以在不产生另一个线程的情况下完成该操作。 例如,如果asynchronous操作是I / O,则CPU不必等待I / O完成。 只需要开始操作,然后可以在I / O硬件(磁盘控制器,networking接口等)进行I / O工作的同时继续执行其他工作。 硬件通过中断CPU,让CPU知道何时完成,然后OS将事件传送到您的应用程序。
经常更高级别的抽象和API不会暴露操作系统和底层硬件可用的底层asynchronousAPI。 在这种情况下,创build线程来执行asynchronous操作通常更容易,即使产生的线程只是等待I / O操作。
如果asynchronous操作需要CPU来完成工作,那么通常这个操作必须发生在另一个线程中才能真正asynchronous。 即使这样,如果有多个执行单元,它也只会是asynchronous的。
不,asynchronous调用并不总是涉及到线程。
他们通常会开始某种与主叫方并行的操作。 但是,该操作可能由另一个进程,OS,其他硬件(如磁盘控制器),networking上的某个其他计算机或人类来处理。 线程并不是平行完成任务的唯一方法。
JavaScript是单线程和asynchronous的。 例如,当您使用XmlHttpRequest时,您提供了一个callback函数,当响应返回时它将被asynchronous执行。
John Resig对定时器如何在JavaScript中工作的相关问题有很好的解释。
multithreading是指在同一进程中发生多个操作。 asynchronous编程遍布进程。 例如,如果我的操作调用Web服务,线程不需要等到Web服务返回。 这里我们使用asynchronous编程,它允许线程不要等待另一台机器上的进程完成。 当它开始从Web服务获得响应时,它可以中断主线程,说Web服务已经完成处理请求。 现在主线程可以处理结果。
自从非抢占式时间(版本2.13,3.0,3.1等)使用消息循环之后,Windows总是进行asynchronous处理,在支持真正的线程之前。 所以要回答你的问题,不,不需要创build一个线程来执行asynchronous处理。
asynchronous调用甚至不需要在调用该调用的系统/设备上发生。 所以如果问题是,asynchronous调用是否需要当前进程中的线程,答案是否定的。 但是,在处理asynchronous请求的地方必须有一个执行线程。
执行线程是一个模糊的术语。 在早期的Macintosh和Windows操作系统这样的合作任务系统中,执行的线程可以简单地是使得请求运行另一个堆栈,指令指针等等的相同进程。然而,当人们通常谈论asynchronous调用,它们通常是指由另一线程处理的调用,如果它是进程内的(即,在同一进程内),或者如果进程间进程则由另一进程处理。
请注意,进程间(或进程间)通信(IPC)通常被推广为包含进程内通信,因为无论执行单独的执行线程在哪个进程中运行,用于locking和同步数据的技术通常都是相同的。
有些系统允许您利用callback来利用内核的并发性。 对于一个比较模糊的例子,在Mac系统6-8的无抢先多任务时间里,asynchronousIOcallback被用来实现非阻塞的networking服务器。
这样你就可以在没有线程的情况下编程并行执行stream。
asynchronous只是意味着你不会阻止你的程序等待某些东西(函数调用,设备等)完成。 它可以在一个单独的线程中实现,但是通常使用一个专用的线程来执行同步任务,并通过某种事件系统进行通信,从而实现asynchronous行为。
有一些单线程asynchronous程序的例子。 就像是:
...do something ...send some async request while (not done) ...do something else ...do async check for results
asynchronous调用的本质是,如果您希望应用程序在调用过程中继续运行,则需要生成一个新线程,或者至less使用您创build的另一个线程,仅用于处理asynchronouscallback。
有时,根据情况,您可能需要调用一个asynchronous方法,但是让用户看起来像是同步的(即阻塞,直到asynchronous方法发出完成信号为止)。 这可以通过Win32 API(如WaitForSingleObject)来实现。