Programming languages 什么';异步、非阻塞、基于事件的体系结构之间的区别是什么?

Programming languages 什么';异步、非阻塞、基于事件的体系结构之间的区别是什么?,programming-languages,asynchronous,blocking,nonblocking,event-based-programming,Programming Languages,Asynchronous,Blocking,Nonblocking,Event Based Programming,这两者之间的区别是什么: 异步 非阻塞,以及 事件库体系结构 是否可以同时使用异步和非阻塞(以及基于事件的) 编程中最重要的是什么:异步、非阻塞和/或事件库(或全部3个) 如果你能提供一些例子,那就太好了 之所以提出这个问题,是因为我读了这篇关于类似主题的伟大文章,但它没有回答我上面的问题。通常,非阻塞体系结构基于方法调用,虽然它们可能在工作者线程上执行很长时间,但不要阻塞调用线程。如果调用线程需要获取工作线程正在执行的任务的相关信息,则由调用线程来完成 基于事件的体系结构基于代码被执行以响

这两者之间的区别是什么:

  • 异步
  • 非阻塞,以及
  • 事件库体系结构
  • 是否可以同时使用异步和非阻塞(以及基于事件的)

  • 编程中最重要的是什么:异步、非阻塞和/或事件库(或全部3个)

  • 如果你能提供一些例子,那就太好了


    之所以提出这个问题,是因为我读了这篇关于类似主题的伟大文章,但它没有回答我上面的问题。

    通常,非阻塞体系结构基于方法调用,虽然它们可能在工作者线程上执行很长时间,但不要阻塞调用线程。如果调用线程需要获取工作线程正在执行的任务的相关信息,则由调用线程来完成

    基于事件的体系结构基于代码被执行以响应触发的事件的概念。代码执行的时间通常是不确定的,但事件可能调用阻塞方法;仅仅因为系统是基于事件的,并不意味着它所做的一切都不是阻塞的

    通常,异步体系结构是基于事件的非阻塞体系结构

    当进行异步调用时,事件处理程序将向提供同步服务的API注册,以便通知调用方调用方感兴趣的事件已经发生。然后调用立即返回(非阻塞行为),调用方可以继续执行。当事件被激发回调用进程时,它们将在该进程中的某个线程上处理

    了解事件是否在同一线程上处理很重要,因为这将影响执行的非阻塞性,但我个人不知道有任何库在单个线程上执行异步执行管理


    我删除了上面的段落,因为它并不像上面所说的那样完全正确。我的意图是说,即使系统中的操作是非阻塞的,例如调用操作系统设施并继续执行,单线程执行的性质意味着当触发事件时,它们将与线程上的其他处理任务竞争计算时间。

    对我来说,非阻塞意味着一个线程中某个操作的执行不依赖于其他线程的执行,特别是不需要关键部分

    异步意味着执行发生在调用方的流之外,并且可能是不同的。执行通常发生在另一个线程中

    读取并发数据是无阻塞的(无需锁定),但是同步的。相反,以同步方式并发写入数据是阻塞(需要独占锁)。从主流的角度来看,使其非阻塞的一种方法是使写操作异步并延迟其执行

    事件的概念是另一种东西,粗略地说,这意味着当事情发生时,你会得到通知。如果写操作是异步执行的,那么一旦执行了写操作,就会引发一个事件来通知系统的其他部分。其他部分将对事件作出响应。系统可以仅基于事件构建,作为组件之间通信的唯一方式(考虑参与者模型),但不一定是这样


    这三个术语是相关的,但对我来说是不同的概念。不过,人们可能会以某种互换的方式使用它们。

    异步 异步的字面意思是不同步。电子邮件是异步的。如果你发了一封邮件,你现在就不希望收到回复。但它不是非阻塞的。本质上,它意味着一种架构,其中“组件”相互发送消息,而不需要立即响应。HTTP请求是同步的。发送请求并获得响应

    非阻塞 该术语主要用于IO。这意味着,当您进行系统调用时,它将立即返回任何结果,而不会让您的线程进入睡眠状态(可能性很高)。例如,非阻塞读/写调用返回它们所能做的一切,并期望调用方再次执行调用。尝试锁定,例如非阻塞呼叫。只有在可以获得锁的情况下,它才会锁定。系统调用的通常语义是阻塞。read将等待,直到它有一些数据并将调用线程置于睡眠状态

    事件基础 这个术语来自libevent。非阻塞读/写调用本身是无用的,因为它们不会告诉您何时应该回它们(重试)。select/epoll/IOCompletionPort等是不同的机制,用于从操作系统“何时”发现这些调用将返回“有趣的”数据。libevent和其他类似的库在各种操作系统提供的这些事件监视设施上提供了包装器,并提供了一个可在操作系统上运行的一致API。非阻塞IO与事件库密切相关


    我认为这些术语重叠。例如,HTTP协议是同步的,但使用非阻塞IO的HTTP实现可以是异步的。同样,像read/write/try\u lock这样的非阻塞API调用是同步的(它会立即给出响应),但“数据处理”是异步的

    在异步硬件中,代码要求某个实体做一些事情,并且在动作完成时可以自由地做其他事情;一旦操作完成,实体通常会以某种方式向代码发送信号。非阻塞体系结构将记录代码可能感兴趣的自发发生的动作,并允许代码询问这些动作是什么