基于事件==异步?

时间:2011-10-28 06:49:04

标签: programming-languages asynchronous synchronous event-driven

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

3 个答案:

答案 0 :(得分:9)

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

在事件驱动的单线程系统中,您可以触发事件,但它们都是串行处理的。它们可以作为其处理的一部分产生,但没有任何事情发生concurrently,如果它们产生,它们就会停止处理并且必须等到它们再次被消息再次开始处理。

示例包括Swing(Java),Twisted(Python),Node.js(JavaScript),EventMachine(Ruby)

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

In programming, asynchronous events are those occurring independently of the main program flow. Asynchronous actions are actions executed in a non-blocking scheme, allowing the main program flow to continue processing.

所以只是因为某些内容event driven没有使asynchronous ,只是因为某些内容asynchronous没有成为event driven {{1}} };更少并发

答案 1 :(得分:3)

它们基本上是正交概念。

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

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

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

答案 2 :(得分:0)

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

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

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