问题标签 [coroutine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
19 回答
50873 浏览

c++ - 你如何在 C++ 中实现协程

我怀疑它可以便携地完成,但有什么解决方案吗?我认为可以通过创建一个备用堆栈并在函数入口处重置 SP、BP 和 IP,并让产量保存 IP 并恢复 SP+BP 来完成。析构函数和异常安全似乎很棘手,但可以解决。

已经完成了吗?这是不可能的吗?

0 投票
47 回答
2829514 浏览

python - “yield”关键字有什么作用?

yieldPython中关键字的用途是什么?它有什么作用?

例如,我试图理解这段代码1

这是调用者:

调用方法时会发生什么_get_child_candidates?是否返回列表?单一元素?又叫了吗?后续调用何时停止?


1. 这段代码由 Jochen Schulz (jrschulz) 编写,他为度量空间制作了一个很棒的 Python 库。这是完整源代码的链接:Module mspace
0 投票
7 回答
15407 浏览

use-case - 协程的用例是什么?

协程的概念听起来很有趣,但我不知道,在真正的生产环境中是否有意义?协程的用例是什么,协程实现比其他方法更优雅、更简单或更高效?

0 投票
13 回答
83628 浏览

concurrency - 什么是协程?

什么是协程?它们与并发有什么关系?

0 投票
5 回答
8426 浏览

python - 从 Python 中的“with”块中产生是否安全(为什么)?

协程和资源获取的结合似乎会产生一些意想不到的(或不直观的)后果。

基本问题是这样的事情是否有效:

它确实如此。(你可以测试一下!)

更深层次的担忧是,with它应该是 的替代品finally,您可以确保在块的末尾释放资源。协程可以在块内暂停和恢复执行,那么冲突如何解决的呢?with

例如,如果您在协程尚未返回时打开一个在协程内部和外部都具有读/写功能的文件:

更新

在前面的示例中,我打算进行写锁定文件句柄争用,但由于大多数操作系统为每个进程分配文件句柄,因此不会出现争用。(感谢@Miles 指出这个例子并没有多大意义。)这是我修改后的例子,它显示了一个真正的死锁情况:

0 投票
3 回答
33957 浏览

python - 协程 vs 延续 vs 生成器

coroutine 和 continuation 和 generator 有什么区别?

0 投票
5 回答
2291 浏览

serialization - 支持序列化协程的语言

我认为当前语言中不存在这种支持。我认为我想做的事情可以通过“工作流引擎”来解决。但是我对工作流程的问题通常是:

  1. 声明式/冗长,我发现命令式风格更简洁
  2. 重量级,我会有很多简单但多样的小状态机

我已经研究了 C# 中的序列化迭代器,但这并没有让我得到我想要的确切位置。我目前正在考虑在Boo中组合一个 DSL,但不确定我是否能够在 Boo 中获得类似协程的行为,并且也能够对其进行序列化。

例子

这是我想做的有限的虚构示例。主要问题是,在例程中的任何时候,您都可能需要获取用户输入。输入之间的时间可能很长,因此需要将服务状态序列化到磁盘。

更新

我在 CPython 中有一个工作的“引擎”。它搭载了 python 中的迭代器/产量支持。所以代码看起来像这样:

哪里rollDice可以打断。通过一些用户操作。然而, CPython不会序列化迭代器。

由于游戏的整个状态可以定义为一系列命令,因此我将游戏状态序列化到协程开始的位置,然后是剩余的命令列表。所以保存/恢复看起来像这样:

目前的调查

我仍然觉得这不令人满意。因为我最终不得不在几乎每种方法上都使用“yield”。我宁愿不必专门装饰一个方法。它在序列化方面也很失败。

目前我正在研究走函数式路线,因为函数式语言似乎对元编程/DSL 创建有更好的支持。目前在看

我希望通过足够强大的元编程设施,我可以自动化状态存储机制。另外,如果我走 F# 路线,我很确定我可以依靠我用来序列化迭代器的“技术”/(hack) 。

0 投票
2 回答
1702 浏览

scheme - 寻求人为的示例代码:延续!

所以我相信我现在至少在某种程度上理解了延续,这要归功于社区计划 wikiFixnum Days 中的 Learn Scheme

但是我想要更多的练习——也就是说,我可以在脑海中完成更多的示例代码(最好是人为的,所以没有多余的东西可以分散这个概念的注意力)。

具体来说,我想解决更多关于恢复和/或协同程序的问题,而不是仅仅使用它们来退出循环或其他任何东西(这相当简单)。

无论如何,如果你知道除了我上面链接的那些之外的好教程,或者如果你想发布你写的东西,这将是一个很好的练习,我将非常感激!

0 投票
9 回答
58677 浏览

multithreading - 线和纤维有什么区别?

线和纤维有什么区别?我听说过 ruby​​ 中的纤维,并且我听说它们有其他语言版本,有人可以简单地向我解释一下线程和纤维之间的区别。

0 投票
5 回答
3860 浏览

python - 用于游戏设计的协程?

我听说协同程序是构建游戏的好方法(例如,PEP 342:“协同程序是表达许多算法的自然方式,例如模拟、游戏......”)但我很难包装我的看看这实际上是如何完成的。

我从这篇文章中看到协程可以表示状态机中的状态,这些状态使用调度程序相互转换,但我不清楚这如何应用于游戏状态根据多个玩家的移动而变化的游戏。

有没有使用协程编写的游戏的简单示例?或者有人可以提供一个如何完成的草图吗?