异步与多线程 - 有区别吗?

时间:2009-03-01 23:18:02

标签: multithreading language-agnostic asynchronous

异步调用是否始终创建新线程?这两者有什么区别?

异步调用是否始终创建或使用新线程?

Wikipedia says

  

在计算机编程中,异步事件是独立于主程序流发生的事件。异步操作是在非阻塞方案中执行的操作,允许主程序流继续处理。

我知道异步调用可以在单线程上完成吗?这怎么可能?

12 个答案:

答案 0 :(得分:92)

每当需要异步发生的操作不需要CPU工作时,可以在不产生另一个线程的情况下完成该操作。例如,如果异步操作是I / O,则CPU不必等待I / O完成。它只需要启动操作,然后在I / O硬件(磁盘控制器,网络接口等)执行I / O工作时继续进行其他工作。硬件通过中断CPU让CPU知道它何时完成,然后操作系统将事件传递给您的应用程序。

通常,更高级别的抽象和API不会公开操作系统和底层硬件提供的底层异步API。在这些情况下,创建线程以执行异步操作通常更容易,即使生成的线程只是在等待I / O操作。

如果异步操作需要CPU工作,那么通常该操作必须在另一个线程中发生,以使其真正异步。即便如此,如果有多个执行单元,它实际上只是异步。

答案 1 :(得分:77)

这个问题近乎无法回答。

在一般情况下,异步调用不一定会创建新线程。这是实现它的一种方式,预先存在的线程池或外部进程是其他方式。它在很大程度上取决于语言,对象模型(如果有的话)和运行时环境。

异步只是意味着调用线程不会等待响应,异步活动也不会在调用线程中发生。

除此之外,你需要更具体。

答案 2 :(得分:15)

不,异步调用并不总是涉及线程。

他们通常会开始某种与呼叫者并行的操作。但是,该操作可能由另一个进程,操作系统,其他硬件(如磁盘控制器),网络上的其他计算机或人类处理。线程不是并行完成任务的唯一方法。

答案 3 :(得分:12)

多线程是指在同一进程中发生多个操作。异步编程跨进程传播。例如,如果我的操作调用Web服务,则该线程不必等到Web服务返回。这里我们使用异步编程,它允许线程不等待另一台机器中的进程完成。当它开始从Web服务获得响应时,它可以中断主线程,表示Web服务已完成处理请求。现在主线程可以处理结果。

答案 4 :(得分:11)

JavaScript是单线程和异步的。例如,当您使用XmlHttpRequest时,您将为其提供一个回调函数,该函数将在响应返回时异步执行。

John Resig对timers work in JavaScript的相关问题有很好的解释。

答案 5 :(得分:10)

在支持实际线程之前,Windows在使用消息循环之前的非抢占时间(版本2.13,3.0,3.1等)总是进行异步处理。所以要回答你的问题,不,没有必要创建一个线程来执行异步处理。

答案 6 :(得分:8)

异步调用甚至不需要在与调用调用的系统/设备相同的系统/设备上进行。因此,如果问题是,异步调用是否需要当前进程中的线程,答案是否定的。但是,必须有处理异步请求的某个执行线程。

执行线程是一个模糊的术语。在早期的Macintosh和Windows操作系统等合作任务系统中,执行的线程可能只是使请求运行另一个堆栈,指令指针等的相同进程......但是,当人们通常谈论异步调用时,它们通常表示由另一个线程处理的调用,如果它是进程内(即在同一进程内),或者是另一个进程,如果它是进程间的。

请注意,进程间(或进程间)通信(IPC)通常被概括为包括进程内通信,因为锁定和同步数据的技术通常是相同的,无论进程的单独线程是什么执行运行。

答案 7 :(得分:6)

有些系统允许您利用回调中的某些功能利用内核中的并发性。对于一个相当模糊的实例,异步IO回调用于在Mac System 6-8的无抢占式多任务处理中实现非阻塞的互联网服务器。

通过这种方式,您可以在“没有线程”的情况下编写并发执行流

答案 8 :(得分:4)

异步只是意味着你不会阻止程序等待某些事情(函数调用,设备等)完成。它可以在一个单独的线程中实现,但通常使用专用线程进行同步任务并通过某种事件系统进行通信,从而实现类似异步的行为。

有单线程异步程序的例子。类似的东西:

...do something
...send some async request
while (not done)
    ...do something else
    ...do async check for results

答案 9 :(得分:2)

异步调用的本质是,如果您希望应用程序在调用过程中继续运行,您将需要生成一个新线程,或者至少利用您创建的另一个线程,仅用于处理异步回调。

有时,根据具体情况,您可能希望调用异步方法,但让用户觉得它是同步的(即阻塞,直到异步方法表明它已完成)。这可以通过Win32 API实现,例如WaitForSingleObject

答案 10 :(得分:1)

异步操作是一种在启动后在后台继续运行的操作,不会强制调用者在运行其他代码之前等待它完成。

异步(也称为非阻塞)实现将向数据库或Web服务或其他任何方式发送请求,而不是阻止调用程序(或线程),然后立即返回,让您的程序继续远程服务发送回复时运行其他代码。一旦响应到来,系统将运行回调(在您的消息循环或单独的IO完成端口线程中,具体取决于环境),让您的代码处理响应。

多线程表示一次运行多个执行线程。在此模型中,所有操作仍然是同步的,但CPU将同时执行多个同步操作线程。

在多核处理器上调用多个(和独立的)CPU绑定操作时,多线程最有意义。例如,独立分析图像中每个像素的程序可以将图像划分为每个CPU核心的一个条带,然后同时分析其自己的线程中的每个条带。

在此处阅读更多内容 - https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/

答案 11 :(得分:0)

异步操作与同步操作[Sync vs Async]不同,它不等到将执行上一个操作。异步的说,即使先前尚未完成,也可以执行此任务。

多线程是关于在多处理器环境中一次运行多个线程。