我有一个牛仔websocket服务器。许多客户端通过websocket发送消息。我需要对信息进行处理。我可以在websocket_handle中做到这一点,然而,因为它是实时的,我想避免它,而不是我想将消息发送到一个全局进程,所有的处理都可以完成。
As每个牛仔都有自己的进程,如何运行一个每个用户都可以发送消息并在该进程中进行处理的进程。
澄清一下,每个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连接有一个单独的进程,你可以在Cowboy的websocket_init/3
函数中启动my_processor
,将my_processor
进程的Pid存储在websocket_init返回的状态参数中,并使用该Pid代替processor
全局名称。