1

私はカウボーイのウェブソケットサーバーを持っています。多くのクライアントは、WebSocket 経由でメッセージを送信します。メッセージを処理する必要があります。私は websocket_handle でそれを行うことができますが、リアルタイムであるため、代わりにそれを避けたいと思います。すべての処理を実行できるグローバル プロセスにメッセージを送信したいと考えています。

各カウボーイには独自のプロセスがあるため、すべてのユーザーがメッセージを送信でき、そのプロセスで処理を実行できるプロセスを実行する方法。

4

1 に答える 1

4

明確にするために、Cowboy では各 Websocket 接続に独自の erlang プロセスがあるため、異なる Websocket クライアントからのメッセージは異なるプロセスで処理されます。

Websocket から処理を移動する必要がある場合は、アプリの起動時 (Cowboy の起動時など) に、プロセス コマンドとデータをリッスンする新しいハンドラー/サーバー プロセスを開始するだけです。サンプル処理コード:

-module(my_processor).

-export([start/0]).

start() ->
    spawn(fun process_loop/0).

process_loop() ->
    receive
    {process_cmd, Data} ->
        process(Data)
    end,
    process_loop().

プロセスを開始するときに、プロセスもグローバル名で登録します。そうすれば、後で Websocket ハンドラーから参照できます。

Pid=my_processor:start().
register(processor, Pid).

これで、Cowboy のwebsocket_handle/3関数から処理プロセスにデータを送信できます。

websocket_handle(Data, Req, State) ->
         ...,
         processor ! {process_cmd, Data},
         ...,
         {ok,Req,State}.

my_processorこのプロセスは、すべての接続からの処理要求を処理することに注意してください。Websocket 接続ごとに個別のプロセスが必要な場合はmy_processor、Cowboy のwebsocket_init/3関数で開始できます。my_processorプロセスの Pid を websocket_init から返された State パラメーターに格納し、processorグローバル名の代わりにその pid を使用します。

于 2013-06-04T08:20:23.887 に答える