如何在 Lua 中等待所有协程完成,就像 Go 语言中的 WaitGroup 一样?

如何在 Lua 中等待所有协程完成,就像 Go 语言中的 WaitGroup 一样?在 Go 语言中,使用 Semaphore 完成 Waitgroup,但在 Lua 中该如何完成呢?或者有更好的方案吗?

点赞
用户734069
用户734069

Lua 不是一个支持线程的脚本语言。它没有多个操作同时进行的概念(你可以在不同的线程上执行不同的独立 Lua 状态,但它们是不同的 Lua 状态。如果你想要它们之间相互通信,那么你必须手动提供方法实现)。

因此,Lua 协程仅仅是一个可以选择挂起其执行的函数,将一些返回值返回给调用该协程的函数。用户可以随后恢复协程,让它继续执行某些任务。这是一种协作式的多任务处理;任务只在它选择的时候才会挂起执行。这与抢占式的多任务处理形成对比,在抢占式的多任务处理中,任务可以停止执行或与其他任务并行执行。

鉴于此,"等待"一个协程或一组协程的想法根本就没有意义。当你想让协程继续执行时,你需要 恢复 它的执行;它不是被动的行为。

你当然可以创建一个协程列表,并依次恢复每个协程,直到它们全部终止。但没有标准 Lua 库函数可以做到这一点,因为它通常对协程所执行的任务没有用处。

2020-01-28 07:40:07