Sockets 在erlang中编写并行TCP服务器
“为并发世界编程Erlang软件”说,要编写并行TCP服务器,请执行以下操作:Sockets 在erlang中编写并行TCP服务器,sockets,tcp,erlang,Sockets,Tcp,Erlang,“为并发世界编程Erlang软件”说,要编写并行TCP服务器,请执行以下操作: start_parallel_server() -> {ok, Listen} = gen_tcp:listen(...), spawn(fun() -> par_connect(Listen) end). par_connect(Listen) -> {ok, Socket} = gen_tcp:accept(Listen), spawn(fun() ->
start_parallel_server() ->
{ok, Listen} = gen_tcp:listen(...),
spawn(fun() -> par_connect(Listen) end).
par_connect(Listen) ->
{ok, Socket} = gen_tcp:accept(Listen),
spawn(fun() -> par_connect(Listen) end),
loop(Socket).
loop(...) -> %% handle request here
当
启动\u并行\u服务器
完成其工作时,它将关闭侦听套接字。我们是否应该在其末尾添加类似于timer:sleep(infinity)
的内容?如果从shell运行start\u parallel\u server()
,shell进程将拥有侦听套接字,因此只要该shell进程处于活动状态,它就会保持活动状态。请注意,shell进程在异常情况下死亡,新的shell进程重新启动……可能会导致混乱
但是,如果您生成一个新进程,然后调用
start\u parallel\u server()
函数,您将需要在生成的进程中进行睡眠以保持其活动状态。此外,对于真实世界的应用程序更合适。@Hynek Pichi Vychodil gen\u tcp将链接到调用gen\u tcp:listen的进程。当此进程在spawn(fun()->par_connect(Listen)end)之后停止时。
则Listen套接字也将关闭。我认为我们应该在start\u parallel\u server()
的末尾添加timer:sleep(infinity)
,这样它就不会结束。是的,这个进程调用gen\u tcp:listen
,它拥有这个套接字,如果它死了,这个监听套接字以及所有用它打开的套接字都将关闭。您可以从一个特殊进程中调用它,也可以使用gen\u tcp:controlling\u process/2
将它移交给另一个进程。