异步调用是否始终创建新线程?两者有什么区别?
异步调用是始终创建还是使用新线程?
维基百科说:
在计算机编程中,异步事件是独立于主程序流发生的事件.异步操作是在非阻塞方案中执行的操作,允许主程序流继续处理.
我知道异步调用可以在单线程上完成吗?这怎么可能?
每当需要异步发生的操作不需要CPU工作时,可以在不产生另一个线程的情况下完成该操作.例如,如果异步操作是I/O,则CPU不必等待I/O完成.它只需要启动操作,然后在I/O硬件(磁盘控制器,网络接口等)执行I/O工作时继续进行其他工作.硬件通过中断CPU让CPU知道它何时完成,然后操作系统将事件传递给您的应用程序.
通常,更高级别的抽象和API不会暴露从OS和底层硬件可用的底层异步API.在这些情况下,创建线程以执行异步操作通常更容易,即使生成的线程只是在等待I/O操作.
如果异步操作需要CPU执行工作,那么通常该操作必须在另一个线程中发生,以使其真正异步.即便如此,如果有多个执行单元,它实际上只是异步.
这个问题非常普遍,无法回答.
在一般情况下,异步调用不一定会创建新线程.这是实现它的一种方式,预先存在的线程池或外部进程是其他方式.它在很大程度上取决于语言,对象模型(如果有的话)和运行时环境.
异步只是意味着调用线程不会等待响应,异步活动也不会在调用线程中发生.
除此之外,你需要更具体.
不,异步调用并不总是涉及线程.
它们通常会启动某种与呼叫者并行的操作.但是,该操作可能由另一个进程,操作系统,其他硬件(如磁盘控制器),网络上的其他计算机或人类处理.线程并不是并行完成任务的唯一方法.
多线程是指在同一进程中发生的多个操作.异步编程跨进程传播.例如,如果我的操作调用Web服务,则该线程不必等到Web服务返回.这里我们使用异步编程,它允许线程不等待另一台机器中的进程完成.当它开始从Web服务获得响应时,它可以中断主线程,表示Web服务已完成处理请求.现在主线程可以处理结果.
Windows在使用消息循环之前的非抢占时间(版本2.13,3.0,3.1等)总是进行异步处理,在支持真实线程之前.所以要回答你的问题,不,没有必要创建一个线程来执行异步处理.
JavaScript是单线程和异步的.例如,当您使用XmlHttpRequest时,您将为其提供一个回调函数,该函数将在响应返回时异步执行.
John Resig很好地解释了定时器如何在JavaScript中工作的相关问题.
异步调用甚至不需要在与调用调用的系统/设备相同的系统/设备上进行.因此,如果问题是,异步调用是否需要当前进程中的线程,答案是否定的.但是,必须在某处处理异步请求的执行线程.
执行线程是一个模糊的术语.在早期的Macintosh和Windows操作系统等合作任务系统中,执行线程可能只是使请求运行另一个堆栈,指令指针等的相同进程......但是,当人们通常谈论异步调用时,它们通常表示由另一个线程处理的调用,如果它是进程内(即在同一进程内),或者是另一个进程,如果它是进程间的.
注意,进程间(或进程间)通信(IPC)通常被概括为包括进程内通信,因为用于锁定和同步数据的技术通常是相同的,而不管执行的单独线程在哪个进程中运行.
有些系统允许您利用回调中的某些设施利用内核中的并发性.对于一个相当模糊的实例,异步IO回调用于在Mac System 6-8的无抢占式多任务处理中实现非阻塞的互联网服务器.
这样,你"中的"有并发执行流你程序而不线程如此.