我有一个牛仔websocket服务器。许多客户端通过websocket发送消息。我需要对消息进行处理。我可以在websocket_handle中这样做,但是因为它是实时的我想避免它而不是我想将消息发送到全局进程,其中所有处理都可以完成。
每个牛仔拥有它自己的流程如何运行一个流程,每个用户都可以在该流程中发送消息和处理。
答案 0 :(得分:3)
为了澄清,每个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的my_processor
函数中启动websocket_init/3
,将my_processor
进程的Pid存储在websocket_init返回的State参数中并使用它pid而不是processor
全局名称。