我试图弄清楚如何使用协程(在 Lua 中)处理事件。我看到一种常见的方法似乎是创建产生当前协程的包装函数,然后在您等待的事情发生时恢复它。这似乎是一个不错的解决方案,但是这些问题呢?:
您如何同时等待多个事件,并根据哪个事件先发生分支?还是应该重新设计程序以避免这种情况?
一段时间后如何取消等待?事件循环可以在其套接字发送/接收包装器中包含超时参数,但是自定义事件呢?
你如何触发协程从外部改变它的状态?例如,我想要一个在调用时会导致协程跳转到不同步骤或开始等待不同事件的函数。
编辑:
目前我有一个系统,我在其中注册一个带有事件的协程,并且每次事件发生时,协程都会以事件名称和信息作为参数恢复。使用这个系统,1 和 2 不是问题,3 可以通过让 coro 期望一个特殊的事件名称来解决,使其跳转到不同的步骤,并使用该名称作为 arg 恢复它。自定义对象也可以具有以相同方式注册事件处理程序的方法。
我只是想知道这是否被认为是使用协程进行事件处理的正确方法。例如,如果我有一个读取事件和一个计时器事件(作为读取的超时),并且读取事件首先发生,我必须手动取消计时器。它似乎不适合顺序性质或使用协程处理事件。