2013-11-22 102 views
2

「二郎編程軟件的並行世界」並行TCP服務器說寫一個並行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() -> par_connect(Listen) end), 
    loop(Socket). 

loop(...) -> %% handle request here 

start_parallel_server完成其工作,將關閉監聽套接字。我們是不是應該在末尾加上timer:sleep(infinity)這樣的東西?

+0

什麼?爲什麼?哪裏? –

+0

@ Hynek-Pichi-Vychodil gen_tcp將鏈接到調用'gen_tcp:listen'的進程。在spawn(fun() - > par_connect(Listen)結束)之後,當這個過程停止時,那麼偵聽套接字也將被關閉。我想我們應該在'start_parallel_server()'末尾添加'timer:sleep(infinity)',這樣它就不會完成。 –

回答

4

如果您從shell運行start_parallel_server(),shell進程將擁有偵聽套接字,因此只要該shell進程處於活動狀態,它就會保持活動狀態。請注意,shell進程在異常時死亡,並且新的shell進程重新生成......可能導致混淆。

但是,如果你產生一個新的進程,依次調用start_parallel_server()函數,您將需要在該產生的進程中進行休眠以保持活躍狀態​​。

+2

是的,它是調用'gen_tcp:listen'的過程,它擁有套接字,如果它死了這個套接字,並且所有打開它的套接字都將被關閉。你可以在一個特殊的進程中調用它,或者用'gen_tcp:controlling_process/2'把它交給另一個進程。 – rvirding