2011-04-30 162 views
30

事件驱动和异步通常用作同义词。两者之间有什么不同吗?事件驱动和异步之间有什么区别?在epoll和AIO之间?

另外,epollaio之间的区别是什么?他们如何融合在一起?

最后,我读过很多次,在Linux中的AIO是可怕的破碎。它究竟如何被打破?

谢谢。

+1

想象一下在使用事件驱动架构时允许异步行为的线程。事件驱动体系结构通常允许程序“生活在一个容器内”(例如,一个线程,一个进程等可以简化某些任务),但不排除其他“跨容器”异步技术。 – 2011-04-30 22:18:05

回答

16

事件是实现异步执行的范例之一。 但并非所有异步系统都使用事件。这是关于这两者的语义意义 - 一个是另一个的超级实体。

的epoll和AIO使用不同的隐喻:

epoll的是阻塞操作(epoll_wait()) - 你阻塞线程,直到一些事件发生,然后你发送的事件不同的过程/函数/分支机构在你的代码。

在AIO中,您将回调函数(完成例程)的地址传递给系统,系统会在发生某些事情时调用您的函数。

AIO的问题是您的回调函数代码从系统线程等系统堆栈顶部运行。你可以想象的几个问题。

2

事件驱动是一个单线程,其中针对特定场景注册事件。当这种情况发生时,事件就会被解雇。然而,即使在那个时候,每个事件都是按顺序发射的。关于它没有什么异步。 Node.js(网络服务器)使用事件来处理多个请求。

异步基本上是多任务处理。它可以产生多个线程或进程来执行某个功能。它与事件驱动完全不同,因为每个线程都是独立的,并且几乎不以简单的响应方式与主线程交互。 Apache(网络服务器)使用多个线程来处理传入的请求。

17

它们是完全不同的东西。

事件驱动范式意味着一旦发生事件,就会将一个名为“事件”的对象发送给程序,而不必定期轮询该“事件”以发现它是否已发生。该“事件”可能被程序困住以执行某些动作(即“处理程序”) - 同步或异步。

因此,处理事件可以是同步的也可以是异步的。例如,JavaScript使用同步事件系统。

异步意味着动作可以独立于当前的“主”执行流而发生。请注意,它确实是而不是的意思是“平行”或“不同线程”。一个“异步”动作可能实际上在主线程上运行,同时阻止“主”执行流。所以不要混淆“异步”和“多线程”。

你可能会说,从技术上来说,异步操作自动假设三项赛 - 至少“完成”,“故障”或“中止/取消”事件(一个或多个的这些)发送到煽动者操作(或底层操作系统本身)表示操作已停止。因此,异步总是由事件驱动的,但不是相反的。

+0

你说 - “请注意,它并不意味着”平行“或”不同线索“。”你能用一个例子来解释一下吗?如果事件在主线程中处理,它如何独立于当前的主执行流? – 2015-01-16 00:21:10

+1

某些软件系统实现协同例程,例如,可以在同一个线程内执行流程之间切换。然而,其他系统可能会在接收到事件时“抢占”当前操作,运行处理程序,然后恢复原始流的执行,而这些都在同一个线程内 - 请考虑中断。一些系统不支持其中的任何一种,并且要求事件被“存储”,等待主线程完成其当前操作,然后明确地“获取”它 - 认为JavaScript和Windows消息循环。 – 2015-01-16 09:09:11

+0

您好斯蒂芬,我认为linux信号处理程序是在这种情况下co-routines的一个实例。这样对吗? – firo 2017-04-04 06:59:03

相关问题