首页 文章

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

提问于
浏览
125

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

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

Wikipedia says

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

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

11 回答

  • 12

    这个问题非常普遍,无法回答 .

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

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

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

  • 4

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

    通常,更高级别的抽象和API不会暴露从OS和底层硬件可用的底层异步API . 在这些情况下,创建线程以执行异步操作通常更容易,即使生成的线程只是在等待I / O操作 .

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

  • 2

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

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

  • 6

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

  • 1

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

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

  • 10

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

  • 74

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

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

    注意进程间(或进程间通信(IPC)通常被概括为包括进程内通信,因为用于锁定和同步数据的技术通常是相同的,而不管执行的单独线程在哪个进程中运行 .

  • 90

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

    这样你就可以在没有线程的情况下编写并发执行流"in" .

  • 11

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

    有一些单线程异步程序的例子 . 就像是:

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

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

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

  • 15

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

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

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

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

    在这里阅读更多 - https://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/

相关问题