【发布时间】:2013-05-30 07:43:08
【问题描述】:
我有一个牛仔 websocket 服务器。许多客户端通过 websocket 发送消息。我需要对消息进行处理。我可以在 websocket_handle 中做到这一点,但是因为它是实时的,所以我想避免它,而是我想将消息发送到可以完成所有处理的全局进程。
因为每个牛仔都有自己的进程 如何运行一个进程,每个用户都可以发送消息,并且可以在该进程中完成处理。
【问题讨论】:
我有一个牛仔 websocket 服务器。许多客户端通过 websocket 发送消息。我需要对消息进行处理。我可以在 websocket_handle 中做到这一点,但是因为它是实时的,所以我想避免它,而是我想将消息发送到可以完成所有处理的全局进程。
因为每个牛仔都有自己的进程 如何运行一个进程,每个用户都可以发送消息,并且可以在该进程中完成处理。
【问题讨论】:
澄清一下,每个 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_processorprocess 的 Pid 存储在从 websocket_init 返回的 State 参数中,并使用该 pid 而不是 @987654329 @ 全局名称。
【讨论】: