コルーチン(Lua)を使用してイベントを処理する方法を理解しようとしています。これを行う一般的な方法は、現在のコルーチンを生成し、待機していることが発生したときにそれを再開するラッパー関数を作成することであるように思われます。それは良い解決策のように思えますが、これらの問題はどうですか?:
同時に複数のイベントを待ち、どちらが先に来るかに応じて分岐するにはどうすればよいですか?または、そのような状況を回避するためにプログラムを再設計する必要がありますか?
一定期間後に待機をキャンセルするにはどうすればよいですか?イベントループは、ソケットの送信/受信ラッパーにタイムアウトパラメータを含めることができますが、カスタムイベントについてはどうでしょうか。
コルーチンをトリガーして、外部から状態を変更するにはどうすればよいですか?たとえば、呼び出されたときにコルーチンを別のステップにジャンプさせたり、別のイベントの待機を開始したりする関数が必要です。
編集:
現在、コルーチンをイベントに登録するシステムがあり、イベントが発生するたびに、イベント名と情報をパラメーターとしてコルーチンが再開されます。このシステムでは、1と2は問題ではなく、3は、コロに別のステップにジャンプする特別なイベント名を期待させ、その名前を引数として再開することで解決できます。また、カスタムオブジェクトには、同じ方法でイベントハンドラーを登録するメソッドを含めることができます。
これがイベント処理にコルーチンを使用する正しい方法と考えられているのではないかと思います。たとえば、読み取りイベントとタイマーイベント(読み取りのタイムアウトとして)があり、読み取りイベントが最初に発生した場合、手動でタイマーをキャンセルする必要があります。これは、コルーチンを使用したシーケンシャルな性質やイベントの処理に適合していないようです。