asynchronous,非阻塞,事件库架构有什么区别?

  1. 有什么区别:

    • asynchronous
    • 不阻塞 ,和
    • 基于事件的体系结构?
  2. 可以是asynchronous非阻塞 (和基于事件的 )?

  3. 什么是最重要的编程,有一些东西:asynchronous,非阻塞和/或事件的基础(或所有3)?

如果你能提供例子,那就太好了。

这个问题被问到,因为我正在阅读这个伟大的StackOverflow文章上类似的话题,但它不回答我上面的问题。

asynchronousasynchronous字面意思是不同步。 电子邮件是asynchronous的 您发送邮件,您不希望现在得到回应。 但它不是非阻塞的。 本质上,它意味着一个体系结构,其中“组件”互相发送消息,而不会立即作出响应。 HTTP请求是同步的。 发送请求并获得响应。

非阻塞这个术语主要用于IO。 这意味着当你进行一个系统调用时,它会立即返回任何结果,而不会让你的线程进入睡眠(很可能)。 例如,非阻塞式读/写调用返回任何他们可以做的事情,并希望调用者再次执行调用。 try_lock例如是非阻塞的调用。 只有获得locking,它才会locking。 系统调用的常用语义是阻塞的。 读取将等待,直到它有一些数据,并把调用线程hibernate。

事件基础这个术语来自libevent。 非阻塞的读/写呼叫本身是无用的,因为它们不告诉你什么时候应该回叫(重试)。 select / epoll / IOCompletionPort等等是从OS发现的“不同的机制”,当这些调用被期望返回“有趣的”数据时。 libevent和其他类似的库提供了各种操作系统提供的这些事件监视工具的封装,并提供了一致的API来处理跨操作系统的运行。 非阻塞IO与事件库结合在一起。

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

在一个asynchronous硬件中,代码要求某个实体做某件事情,在动作完成时可以自由地做其他事情; 一旦行动完成,实体将通常以某种方式发信号通知该代码。 非阻塞体系结构将logging代码可能感兴趣的自发行为,并允许代码询问发生了什么样的行为,但代码只有在明确询问这些行为时才会意识到这种行为。 当事件自发发生时,基于事件的架构将肯定地通知代码。

考虑一个串行端口,代码将要从中接收1,000字节。

在阻塞式读取架构中,代码将等待直到1,000个字节到达或者决定放弃。

在asynchronous读取体系结构中,代码将告诉驱动程序需要1,000字节,并在1,000字节到达时通知。

在一个非阻塞体系结构中,代码可以随时询问有多less字节已经到达,并且可以在它认为合适的时候读取任何或所有这样的数据,但是知道所有数据何时到达的唯一方法是询问; 如果代码想要在第一千字节到达四分之一秒内找出,则必须每隔四分之一秒检查一次。

在基于事件的体系结构中,串行端口驱动程序将在任何时候通知应用程序有数据到达。 驱动程序不知道应用程序需要多less字节,所以应用程序必须能够处理小于或大于应用程序所需数量的通知。

对我来说,非阻塞意味着一个线程中的一个动作的执行并不取决于其他线程的执行,它确实不需要关键的部分。

asynchronous意味着执行发生在调用者的stream程之外,并且可能被缓冲。 执行通常发生在另一个线程中。

读取并发数据是非阻塞的(不需要locking),但是同步的。 反过来,以同步方式并发写入数据是阻塞的(要求独占锁)。 从主stream的angular度来看,使其不阻塞的一种方法是使写入asynchronous并推迟执行。

事件的概念是另一回事,粗略地说,意味着什么时候发生了什么。 如果写入已经asynchronous执行,则一旦写入被执行,就会引发事件通知系统的其他部分。 其他部分将回应事件。 系统可以完全build立在事件之间,作为组件之间通信的唯一途径(想​​到行为者模型),但不一定必须如此。

这三个术语是相关的,但对我来说却是不同的概念。 尽pipe如此,人们可以用一些可以互换的方式来使用它们。

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

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

通常,asynchronous架构是基于事件的非阻塞架构。

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

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

我删除了上面的段落,因为它不是严格正确的。 我的意图是说,即使系统中的操作是非阻塞的,比如向OS设施发出调用并继续执行,单线程执行的性质意味着当事件被触发时,它们将与在线程上计算时间的其他处理任务。

Interesting Posts