异步调用是否总是会创建一个新的线程?这两者有什么区别?
异步调用是否总是会创建或使用一个新的线程?
维基百科上说:
在计算机编程中,异步事件是指独立于主程序流程发生的事件。异步操作是以非阻塞方式执行的操作,允许主程序流程继续处理。
我知道异步调用可以在单个线程上执行,那这是如何实现的呢?
异步调用是否总是会创建一个新的线程?这两者有什么区别?
异步调用是否总是会创建或使用一个新的线程?
维基百科上说:
在计算机编程中,异步事件是指独立于主程序流程发生的事件。异步操作是以非阻塞方式执行的操作,允许主程序流程继续处理。
我知道异步调用可以在单个线程上执行,那这是如何实现的呢?
这个问题过于笼统,难以回答。
一般情况下,异步调用并不一定创建一个新线程。这是一种实现方式,预先存在的线程池或外部进程是其他方式。它严重依赖于语言、对象模型(如果有)和运行时环境。
异步只是表示调用线程不会坐等响应,也不会在调用线程中进行异步操作。
除此之外,你需要更具体的信息。
不,异步调用并不总是涉及线程。
通常情况下,它们会启动某种操作,该操作与调用方同时进行。但该操作可能由另一个进程、操作系统、其他硬件(如磁盘控制器)、网络上的其他计算机或人类处理。线程并不是实现并行处理的唯一方式。
JavaScript是单线程且异步的。例如,当您使用XmlHttpRequest时,会提供一个回调函数,该函数将在响应返回时异步执行。
John Resig对JavaScript中计时器的工作原理有很好的解释。
多线程指的是在同一进程中发生多个操作。而异步编程则涉及到跨进程。例如,如果我的操作调用了一个Web服务,线程不需要等待Web服务返回。这里我们使用异步编程来允许线程不等待另一台机器上的进程完成。当它开始从Web服务获取响应时,它可以中断主线程以表示Web服务已经完成处理请求。现在主线程可以处理结果。
自非抢占式时代(版本2.13、3.0、3.1等)以来,Windows一直使用消息循环进行异步处理,早在支持真正的线程之前。所以回答你的问题,不需要创建线程来执行异步处理。
有些系统允许您利用内核的并发性来使用回调函数实现某些功能。例如,在 Mac System 6-8 的非抢占式多任务处理器时代,异步IO回调被用于实现非阻塞互联网服务器。
这样,您可以在程序中拥有并发执行流,而无需像线程一样使用它们。
异步只是指您不会阻塞程序等待某些东西(函数调用、设备等)完成。它可以在单独的线程中实现,但通常使用专用线程进行同步任务,并通过某种事件系统进行通信,从而实现类似异步的行为。
有单线程异步程序的示例。像这样的东西:
...do something
...send some async request
while (not done)
...do something else
...do async check for results