2

Lua の本を何冊か読んでいて、いくつかの古い (そして書き方が悪い) C コードを Lua と C の混合コードに移行することを考えています。

ただし、このレガシー コードではスレッドを使用していくつかの重要なタスク (基本的にはオーディオ/ビデオ ストリーミング) を処理する一方で、注意が必要な単純なタスク (ユーザー インターフェイス) もあります。私が読んだことによると、Lua はスレッドを直接サポートしておらず、コルーチンの使用を促進しています。

このような状況でコルーチンベースの環境に移行するのは正気でしょうか? 私の考えでは、重要度の低いコルーチンを再開しようとするたびに、優先度の高いコルーチンを常に最初に再開しようとするディスパッチャーを思い浮かべることができます。経験がないのでこちらで質問させていただきます。

編集

詳細については、ニコル・ボーラスから尋ねられました。

これはリアルタイムアプリケーションです。新しいビデオ フレームを処理する準備ができた場合など、一部のイベントを処理するために大きな遅延が発生するわけにはいきません。以前の C プログラムでは、これを行うためにスレッドとコールバックを使用していました。たとえば、新しいフレームが発生すると、コールバックが呼び出され、データが処理のために準備されます (プロデューサーとしてのコールバックとコンシュームとしてのビデオ スレッド)。

コールバックをどうするかについてはまだ考えていません (おそらく C で保持し、いくつかのミューテックスを使用して Lua コードのデータを更新します)。 、この種の問題に適しています。誰かがいくつかの例やストーリーを持っていて、それを共有したい場合.

4

2 に答える 2

0

これを試せない理由はありません。肝心なのは、適切なスケジューラーを作成し、どのルーチンも実行に時間がかかりすぎないようにすることです。

これがどれだけ難しいかはコードによって異なりますが、スケジューラはかなり単純である可能性が高く、優先順位または単純なタイマーを使用します (重要なルーチンが最後に実行された時間が N ミリ秒を超える場合は、重要なルーチンを実行します)。

yield にはいくつかの利点があり、確かに同期が簡単になります。

簡単に言えば、それを証明して、それが十分に効果的かどうかを確認する必要があります. 少し試してみると、これが実際にうまくいくかどうかが合理的にすぐにわかるはずです。その音から、あなたのスケジューラーはおそらくあまり洗練されていません。それを汎用のものにする理由はありません。単純にして、実行中のタスク専用に保ち、「一般的なもの」を丸めたり、オペレーティングシステムの教科書からランダムなスケジューラを引き出したりする理由はありません。

于 2012-09-07T04:25:03.687 に答える
0

おそらくこれを行うことができます。私が知る限り、あなたの主な課題は、あなたが与えることができる最小の時間のチャンクを決定し、このチャンクを超えないようにする方法を決定することです.

たとえば、ストリーミングで最大 10 ミリ秒の遅延を許容できるとします。これは、UI 操作を 10 ミリ秒以内のチャンクに分割する必要があることを意味します。UI コルーチンを再開してファイルを検索し、ファイルを読み取る必要があり、そのファイルが大きく、読み取り時間が 10 ミリ秒を超えた場合はどうなるでしょうか? ストリーミング コルーチンは、UI コルーチンが制御をスケジューラに返し、スケジューラがストリーミング コルーチンを再開するまで、制御を取得しません。これは、UI が実行できるすべての操作と、それらすべてが設定された時間制限に従うことを保証する方法について十分に注意する必要があることを意味するだけです。

プリエンプティブなマルチタスキングでは、スケジューラーがそれを処理しますが (ただし、独自の欠点があります)、コルーチンの場合は、UI ロジックがそれを処理する必要があります。いくつかの同様のロジックを持つ lua ライブラリがあります (たとえば、copas は、タイムアウトを使用してソケットに必要なものに近いことを行います)。

コールバックとコルーチンを比較すると、コルーチンのアプローチがますます好きになり始めています。できることはおそらく同等ですが、コルーチン ベースのコードは、コールバック ベースのコードよりも読みやすく (そして多くの場合、書きやすく) なっています (厳密に言えば、私の意見では)。

于 2012-09-07T05:31:55.567 に答える