【问题标题】:When to use fibers and when to use co-routines in Tarantool?在 Tarantool 中何时使用纤维以及何时使用协同程序?
【发布时间】:2016-07-09 05:28:22
【问题描述】:

在 Tarantool 中,当 Lua 代码作者希望 Tarantool 安排执行时,是否使用了 Fiber?当 Lua 代码作者想要控制执行时,是否使用协程(在 Tarantool/LuaJIT 进程中)?

【问题讨论】:

  • 在 Tarantool 中,纤维是协程的同义词。我们建议您始终使用我们的纤维,而不是 Lua 协程,因为它们更强大。我们的整个 I/O 堆栈都与它们集成在一起:套接字、文件、net.box、mysql、postgresql 等。
  • 协程可以用于一些任务,比如迭代器。同时使用协程和纤程是完全有效的,但这可能会导致混淆。协程收益可能会因臭名昭著的attempt to yield across C-call boundary 而失败,而纤程在这种情况下工作。

标签: tarantool


【解决方案1】:

在 Tarantool 中,纤维是协程的同义词。纤维更多地集成到 Tarantool I/O 等,您应该使用它们而不是 lua 协程。我们建议您始终使用我们的纤维,而不是 Lua 协程,因为它们更强大。我们的整个 I/O 堆栈都与它们集成在一起:套接字、文件、net.box、mysql、postgresql 等。

文档链接:http://tarantool.org/doc/reference/fiber.html

协程可以用于一些任务,例如迭代器。同时使用协程和纤程是完全有效的,但这可能会导致混淆。协同程序产量可能会因臭名昭著的attempt to yield across C-call boundary 而失败,而纤程在这种情况下工作。

【讨论】:

  • 感谢您的快速回复。
  • 还有其他副作用需要注意吗?
【解决方案2】:

光纤堆栈大于协程之一。它被 mmapp'ed 到 64KB,并且至少是一个操作系统页面(通常是 4KB)。 Fiber 上下文切换会产生额外的开销,因为它除了隐藏/恢复协程之外还隐藏/恢复寄存器。 Fiber 上下文切换会破坏 LuaJIT 中的 JIT,因为 LuaJIT 无法隐藏/恢复跟踪的执行。与协程不同的是,fibers 可以很好地与应用服务器中内置的所有非阻塞 IO 配合使用:当一个纤程在 IO 调用上隐式让步时,另一个纤程就会启动。但不是另一个协程,当然,你必须小心如果您正在使用它们,请自行处理。

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2014-01-16
    • 2015-09-06
    • 2021-05-31
    • 2016-02-11
    相关资源
    最近更新 更多