1

我有一个牛仔 websocket 服务器。许多客户端通过 websocket 发送消息。我需要对消息进行处理。我可以在 websocket_handle 中做到这一点,但是因为它是实时的,所以我想避免它,而是我想将消息发送到可以完成所有处理的全局进程。

因为每个牛仔都有自己的进程如何运行一个进程,每个用户都可以发送消息,并且可以在该进程中完成处理。

4

1 回答 1

4

澄清一下,每个 websocket 连接在 Cowboy 中都会有自己的 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 参数中,并使用该 pid 而不是processor全局名称。

于 2013-06-04T08:20:23.887 回答