1

問題は、Lua サーバーが複数の要求を同時に受け入れることができないことです。各クライアント メッセージを on コルーチンで処理しようとしましたが、失敗したようです。

while true do
local client = server:accept()
coroutine.resume(coroutine.create( function()
GiveMessage( client )
end ) )
end

このコードは、実際には同時に複数のクライアント メッセージを受け付けないようです。この方法の何が問題なのですか? 助けてくれてありがとう。

4

2 に答える 2

4

コルーチンのみで真の同時処理を作成することはできません—コルーチンは協調マルチタスク用です。同時に実行されるコルーチンは1つだけです。

作成したコードはGiveMessage()、ループで直接呼び出すのと同じです。GiveMessage()コルーチンディスパッチャーを作成し、そのアプローチが機能するために譲歩する賢明な理由を見つける必要があります。

タスクの詳細に応じて、少なくとも3つの解決策があります。

  • サーバーのいくつかのフォークを生成し、各フォークのコルーチンで操作を処理します。Copaslua-ev 、または自家製のディスパッチャーを使用してコルーチンを制御します。これは問題ありません。私はこの方法をお勧めします。

  • コルーチンの代わりにLua状態を使用し、状態のプール、ワーカーOSスレッドのプール、およびタスクのキューを保持します。無料のワーカースレッドを使用して、無料のLua状態で各タスクを実行します。低レベルのコーディングが必要で、面倒です。

  • 既存のより専門的なソリューションを探してください。いくつかありますが、それについてアドバイスするには、作成しているサーバーの種類をよりよく知る必要があります。

  • どちらを選択する場合でも、複数のスレッドから同時に単一のLua状態を使用することは避けてください。(適切な量のコーディングで可能ですが、悪い考えです。)

于 2011-02-19T09:50:55.823 に答える
-1

私の知る限り、コルーチンはすぐに使用できる luaSocket ではうまく機能しません。しかし、使用できるコパスがあります。

于 2011-02-19T09:39:59.833 に答える