在 Tarantool 中何时使用纤程以及何时使用协程?
When to use fibers and when to use co-routines in Tarantool?
在 Tarantool 中,当 Lua 代码作者希望 Tarantool 安排执行时是否使用纤程?当 Lua 代码作者想要控制执行时是否使用协程(在 Tarantool/LuaJIT 进程中)?
在 Tarantool 中,纤程与协程同义。纤程更集成到 Tarantool I/O 等,您应该使用它们而不是 lua 协程。我们建议您始终使用我们的纤程,而不是 Lua 协程,因为它们更强大。我们的整个 I/O 堆栈都与它们集成在一起:套接字、文件、net.box、mysql、postgresql 等
Link 到文档:http://tarantool.org/doc/reference/fiber.html
有些任务可以使用协程,例如迭代器。同时使用协程和纤程是完全有效的,但这可能会造成混淆。协程 yield 可能会失败并出现臭名昭著的 attempt to yield across C-call boundary
,而纤程在这种情况下可以正常工作。
Fiber 堆栈比协程之一大。它被 mmapp'ed 到 64KB,并且至少是一个 OS 页(通常为 4KB)。 Fiber 上下文切换会产生额外的开销,因为它 hides/restores 除了 hiding/restoring 协程之外还需要注册。 Fiber 上下文切换破坏了 LuaJIT 中的 JIT,因为 LuaJIT 无法 hide/restore 跟踪执行。与协程不同,纤程与应用程序服务器中内置的所有非阻塞 IO 配合得很好:每当一个纤程在 IO 调用中隐式让步时,另一个纤程就会启动。但不是另一个协程,当然,你必须小心如果您正在使用它们,请自己考虑。
在 Tarantool 中,当 Lua 代码作者希望 Tarantool 安排执行时是否使用纤程?当 Lua 代码作者想要控制执行时是否使用协程(在 Tarantool/LuaJIT 进程中)?
在 Tarantool 中,纤程与协程同义。纤程更集成到 Tarantool I/O 等,您应该使用它们而不是 lua 协程。我们建议您始终使用我们的纤程,而不是 Lua 协程,因为它们更强大。我们的整个 I/O 堆栈都与它们集成在一起:套接字、文件、net.box、mysql、postgresql 等
Link 到文档:http://tarantool.org/doc/reference/fiber.html
有些任务可以使用协程,例如迭代器。同时使用协程和纤程是完全有效的,但这可能会造成混淆。协程 yield 可能会失败并出现臭名昭著的 attempt to yield across C-call boundary
,而纤程在这种情况下可以正常工作。
Fiber 堆栈比协程之一大。它被 mmapp'ed 到 64KB,并且至少是一个 OS 页(通常为 4KB)。 Fiber 上下文切换会产生额外的开销,因为它 hides/restores 除了 hiding/restoring 协程之外还需要注册。 Fiber 上下文切换破坏了 LuaJIT 中的 JIT,因为 LuaJIT 无法 hide/restore 跟踪执行。与协程不同,纤程与应用程序服务器中内置的所有非阻塞 IO 配合得很好:每当一个纤程在 IO 调用中隐式让步时,另一个纤程就会启动。但不是另一个协程,当然,你必须小心如果您正在使用它们,请自己考虑。