7

关于维基百科中的例子: http ://en.wikipedia.org/wiki/Coroutine

var q := new queue

coroutine produce
    loop
        while q is not full
            create some new items
            add the items to q
        yield to consume

coroutine consume
    loop
        while q is not empty
            remove some items from q
            use the items
        yield

我只是想知道传统的基于事件的方法可以处理这种使用模式,为什么需要使用协程?

4

2 回答 2

6

我认为协程是“传统的”,而事件是“现代的”。但是,它们也有不同的目的;AFAIK,协程可以指定在哪里转移控制(如方法调用)或用于分时,而事件是松散耦合的通信(即在分层架构中“向上”通信)。

如果您对此类内容感兴趣,请务必阅读Eric Lippert 的博客系列(自 2010 年 10 月起)关于延续传递风格。有一篇题为“关于协程的思考”的帖子。

于 2011-02-13T10:25:54.690 回答
0

在事件驱动的编程中,您正在使用状态机,您需要显式地保持当前状态并在该状态下处理您正在进行的工作,方法是使用开关或一系列回调。这样的程序是非线性的。

在基于协程的系统中,您可以像通常编写单线程程序一样编写线性程序,但不是在每个事件等待点阻塞,而是切换上下文并让其他组件完成工作,直到您的事件到来。在许多基于协程的系统中,您会发现一个事件循环驱动协程并在协程事件到达时切换进出协程。

于 2019-08-26T17:20:37.080 回答