问题标签 [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.
c++ - 你如何在 C++ 中实现协程
我怀疑它可以便携地完成,但有什么解决方案吗?我认为可以通过创建一个备用堆栈并在函数入口处重置 SP、BP 和 IP,并让产量保存 IP 并恢复 SP+BP 来完成。析构函数和异常安全似乎很棘手,但可以解决。
已经完成了吗?这是不可能的吗?
python - “yield”关键字有什么作用?
yield
Python中关键字的用途是什么?它有什么作用?
例如,我试图理解这段代码1:
这是调用者:
调用方法时会发生什么_get_child_candidates
?是否返回列表?单一元素?又叫了吗?后续调用何时停止?
1. 这段代码由 Jochen Schulz (jrschulz) 编写,他为度量空间制作了一个很棒的 Python 库。这是完整源代码的链接:Module mspace。
use-case - 协程的用例是什么?
协程的概念听起来很有趣,但我不知道,在真正的生产环境中是否有意义?协程的用例是什么,协程实现比其他方法更优雅、更简单或更高效?
concurrency - 什么是协程?
什么是协程?它们与并发有什么关系?
python - 从 Python 中的“with”块中产生是否安全(为什么)?
协程和资源获取的结合似乎会产生一些意想不到的(或不直观的)后果。
基本问题是这样的事情是否有效:
它确实如此。(你可以测试一下!)
更深层次的担忧是,with
它应该是 的替代品finally
,您可以确保在块的末尾释放资源。协程可以在块内暂停和恢复执行,那么冲突是如何解决的呢?with
例如,如果您在协程尚未返回时打开一个在协程内部和外部都具有读/写功能的文件:
更新
在前面的示例中,我打算进行写锁定文件句柄争用,但由于大多数操作系统为每个进程分配文件句柄,因此不会出现争用。(感谢@Miles 指出这个例子并没有多大意义。)这是我修改后的例子,它显示了一个真正的死锁情况:
python - 协程 vs 延续 vs 生成器
coroutine 和 continuation 和 generator 有什么区别?
serialization - 支持序列化协程的语言
我认为当前语言中不存在这种支持。我认为我想做的事情可以通过“工作流引擎”来解决。但是我对工作流程的问题通常是:
- 声明式/冗长,我发现命令式风格更简洁
- 重量级,我会有很多简单但多样的小状态机
我已经研究了 C# 中的序列化迭代器,但这并没有让我得到我想要的确切位置。我目前正在考虑在Boo中组合一个 DSL,但不确定我是否能够在 Boo 中获得类似协程的行为,并且也能够对其进行序列化。
例子
这是我想做的有限的虚构示例。主要问题是,在例程中的任何时候,您都可能需要获取用户输入。输入之间的时间可能很长,因此需要将服务状态序列化到磁盘。
更新
我在 CPython 中有一个工作的“引擎”。它搭载了 python 中的迭代器/产量支持。所以代码看起来像这样:
哪里rollDice
可以打断。通过一些用户操作。然而, CPython不会序列化迭代器。
由于游戏的整个状态可以定义为一系列命令,因此我将游戏状态序列化到协程开始的位置,然后是剩余的命令列表。所以保存/恢复看起来像这样:
目前的调查
我仍然觉得这不令人满意。因为我最终不得不在几乎每种方法上都使用“yield”。我宁愿不必专门装饰一个方法。它在序列化方面也很失败。
目前我正在研究走函数式路线,因为函数式语言似乎对元编程/DSL 创建有更好的支持。目前在看
- F# 计算表达式
- 哈斯克尔
我希望通过足够强大的元编程设施,我可以自动化状态存储机制。另外,如果我走 F# 路线,我很确定我可以依靠我用来序列化迭代器的“技术”/(hack) 。
scheme - 寻求人为的示例代码:延续!
所以我相信我现在至少在某种程度上理解了延续,这要归功于社区计划 wiki和Fixnum Days 中的 Learn Scheme。
但是我想要更多的练习——也就是说,我可以在脑海中完成更多的示例代码(最好是人为的,所以没有多余的东西可以分散这个概念的注意力)。
具体来说,我想解决更多关于恢复和/或协同程序的问题,而不是仅仅使用它们来退出循环或其他任何东西(这相当简单)。
无论如何,如果你知道除了我上面链接的那些之外的好教程,或者如果你想发布你写的东西,这将是一个很好的练习,我将非常感激!
multithreading - 线和纤维有什么区别?
线和纤维有什么区别?我听说过 ruby 中的纤维,并且我听说它们有其他语言版本,有人可以简单地向我解释一下线程和纤维之间的区别。