(评论)
(comments)
原始链接: https://news.ycombinator.com/item?id=39502276
在计算机科学中,协程(也称为可恢复函数、子例程、Lua 中的用户定义生成器、Scheme 中的连续传递样式或可挂起函数)是一种组合机制或编程语言构造,它允许使用yield 语句(相当于不返回而返回) 立即执行封闭函数的剩余主体)代替传统的函数调用或继续。 这种机制允许创建在调用者和被调用者之间交替的控制流,类似于协作多任务处理或协程式通信,具有如下所述的内存分配能力。 大多数主流编程语言(包括Java或.NET等流行平台,以及一些脚本语言)都没有提供定义协程的特定语法或语言功能; 相反,开发人员通常利用现有的原语(函数、子例程、例程等)以及基于控制流(GOTO、标签和分支)或连续传递样式(方案)的技术来模拟协程呈现的行为。 然而,这个概念在计算数学和计算机科学中仍然具有理论上的重要意义,部分原因是它们能够减少全局状态的使用并改善竞争条件等系统范围的属性。 在一些实际场景中,与协同路由相比,替代模型(例如光纤)可能会表现出更低的开销。 虽然协程本身可以表现出多种好处(例如与替代方案相比更简洁,以及支持更简单的代码库或设计),但这种效果需要额外的认知负荷,从而增加与维护任务相关的复杂性。
文本材料中引用的一个示例解释了“C 中的协程”可以帮助消除“全局变量反模式”,正如在较大应用程序框架的嵌套循环中所演示的那样。 另一个例子涉及用 C 等语言实现带有协程的生成器,并在较长的空闲时间内异步利用它们,从而提高在要求较高的使用模式下的响应能力。 此外,某些操作系统内核级驱动程序和网络实用程序(例如由命令行终端处理的 Telnet 或串行设备)在实践中利用类似的设计模式。 与递归相反,递归可能导致函数调用被堆叠直到达到最大阈值(导致深堆栈帧和有关过多内存分配或耗尽可用资源的潜在问题),以及显式消息队列方案(这可以
My conclusion for now is that the choice to use C coroutines is best left to the library user. For example: Mongoose (https://github.com/cesanta/mongoose) uses event callbacks to deal with asynchronousness. It is much more pleasant to wrap a library like this in whatever thread/task primitives your system has rather than try to port the mythical cross-platform C couroutine or worse, std::thread.
reply