4

“基于事件”与“异步”相同吗?

4

3 回答 3

10

不,这并不意味着事件是异步的。

在事件驱动的单线程系统中,您可以触发事件,但它们都是串行处理的。他们可能会在处理过程中让步,但没有任何concurrently反应,如果他们让步,他们会停止处理并必须等到再次收到消息才能再次开始处理。

例如 Swing (Java)、Twisted (Python)、Node.js (JavaScript)、EventMachine (Ruby)

所有这些示例都是事件驱动的消息循环,但它们都是单线程的,每个事件都会阻塞同一线程上的所有后续事件。

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

所以仅仅因为某事event driven没有成功asynchronous,也仅仅因为某事asynchronous也没有成功event driven并发的少得多。

于 2011-10-28T06:53:58.817 回答
3

它们本质上是正交的概念。

事件驱动”本质上意味着与某些函数调用关联的代码在运行时绑定(并且可以通过执行进行更改)。谁“触发”事件不知道什么会处理它,谁处理事件被定义为通过在程序执行时定义的关联来响应事件。通常通过函数指针、引用或指向携带虚方法的对象的指针等)

异步”意味着程序流不必等待调用执行后再继续进行(主要通过在将执行委托给另一个线程或进程后立即返回的调用来实现)

并非所有事件都是异步的(想想 windows SendMessage,尊重PostMessage),并且并非所有异步调用都必须由“事件”实现(尽管使用事件机制来实现异步调用很常见)

于 2011-10-28T07:05:43.350 回答
0

异步的一个含义是,在您发出计算时,您不会等待答案,而是稍后会得到答案。答案与您的正常控制流程正交。

答案的一种方式是使用事件:在这种情况下它们会自发发生,而无需您的代码触发它们。在处理程序中,您可以处理结果。

虽然计算和答案是通过同步模式的控制流中的点连接的,但您必须在异步模式下自己进行连接。例如通过使用序列号或其他东西。

于 2011-10-28T07:09:49.813 回答