【问题标题】:What's the advantage of stack-less Python's microthread than Lua's coroutine in state machine implementation for game?在游戏的状态机实现中,无堆栈 Python 的微线程比 Lua 的协程有什么优势?
【发布时间】:2011-05-03 03:37:17
【问题描述】:
与 Lua 的协程相比,无堆栈 python 实现有什么优势吗?
它们有什么区别?
【问题讨论】:
标签:
python
lua
coroutine
stackless
python-stackless
【解决方案1】:
stackless python 和 tasklets(我没有用 stackless python 做过任何编程,但我已经阅读了一些关于它是如何实现的细节):
优点:
- 大部分时间都很轻便。
- 具有调度程序来管理在当前一个小任务产生后哪个小任务下一个恢复。
- 支持抢先调度。 (即运行 X 指令)
- tasklet 之间的通信渠道。
缺点:
- 从小任务中让出时有时需要 C 堆栈。 (即当从一些 C 回调中产生时)
带有普通协程的 Lua 5.1:
优点:
- 轻巧。
- resume()/yield() 函数允许使用消费者/生产者的通信模型。
缺点:
- 没有内置调度程序。您必须管理恢复和产生协程。
- 无法从 C 函数、元方法或迭代器中产生。 (Lua 5.2 将消除大部分这些限制,LuaJIT 1.1 提供轻量级的 c-stack 切换以从任何地方产生)
- 没有内置的抢先调度支持。 (必须使用调试钩子)
Lua 5.1 与 ConcurrentLua:
优点:
- 轻巧。
- 具有协作上下文切换的调度程序。
- 具有 Erlang 风格的任务之间的消息传递通信。
- 支持节点之间的透明分布式消息传递。
缺点:
- 无法从 C 函数、元方法或迭代器中产生。 (同样,大部分限制在 Lua 5.2 和 LuaJIT 中消失)
- 没有内置的抢先调度支持。 (必须使用调试钩子)
LuaJIT 2.0 Beta 与 ConcurrentLua:
优点:
- 轻巧。
- 具有协作上下文切换的调度程序。
- 具有 Erlang 风格的任务之间的消息传递通信。
- 支持节点之间的透明分布式消息传递。
- 非常快速的 JIT 支持使得 Lua much faster then Python
缺点:
- 现在可能无法从 C 函数中产生。这可能会在未来的版本中得到支持。
- 没有内置的抢先调度支持。 (必须使用调试钩子)