协程栈是否以Lua,Python,Ruby或任何其他语言增长?

问题描述:

有一些语言支持确定性轻量级并发 - 协程。协程栈是否以Lua,Python,Ruby或任何其他语言增长?

  1. 的Lua - 协程
  2. 堆栈少的Python - 微进程
  3. 红宝石 - 纤维
  4. 应该有更多...但目前我没有太多的想法。

无论如何,据我所知,它需要很多独立的堆栈,所以我想知道这些语言如何处理堆栈增长。这是因为我读到了带有4KB的some mention about Ruby Fiber - 显然是很大的开销 - 他们将此作为防止堆栈溢出的功能进行宣传。但我不明白他们为什么只是说堆栈会自动增长。虚拟机 - 不限于C堆 - 无法处理堆栈增长,但是我无法证实这一点,因为我不了解内部组件。

他们如何处理这些微线程上的堆栈增长?有没有明确/隐含的限制?或者只是将自动处理清楚和自动?

对于红宝石:

按本google tech talk红宝石VM使用涉及具有每个线程的C堆栈的副本,​​然后每次纤维之间切换时间复制该堆栈上的主堆叠稍微哈克系统。这意味着Ruby仍然限制每个光纤的堆栈大于4KB,但如果在深度嵌套的光纤之间切换,解释器不会溢出。

对于python:

task-let仅适用于无堆栈变体。由于无堆栈python vm使用基于堆栈的堆栈,每个线程都有自己的基于堆栈的堆栈。这种混乱本质上仅限于堆栈增长的堆栈大小。这意味着对于32位系统,仍然有一个1-4 GB的有效限制。

为lua:

Lua使用基于堆栈所以固有地仅限定于堆栈增长的堆的大小。每个协程在内存中获取自己的堆栈。这意味着对于32位系统,仍然有一个1-4 GB的有效限制。

若要添加更多到您的列表C#和VB.Net现在都支持异步/等待。这是一个允许程序执行耗时操作并使该功能的其余部分继续执行的系统。这是通过创建一个对象来用一个方法来表示该方法的,该方法被调用以前进到当您尝试获取结果和各种其他内部位置时调用的方法中的下一个步骤。原始方法被替换为创建对象的方法。这意味着递归深度不会受到影响,因为该方法永远不会比您预期的更多。