我對erlang/otp世界還是一種新鮮感,所以我想這是一個非常基本的問題。不過,我想知道進行以下操作的正確方法。如何在gen_tcp上調用(和休眠):接受並同時處理系統消息?
目前,我有一個頂級主管的應用程序。後者將監督調用gen_tcp的工作人員:接受(就緒),然後爲每個接受的連接生成一個進程。注意:對於這個問題,listen()完成的地方並不重要。
我的問題是關於讓這些工作者(那些睡在gen_tcp:accept上的工作者)尊重otp設計原則的正確方式,以這種方式他們可以處理系統消息(處理關閉,跟蹤等)據我在這裏讀到:http://www.erlang.org/doc/design_principles/spec_proc.html
所以,
- 是否有可能使用像的gen_fsm或gen_server此可用的行爲嗎?我的猜測是否定的,因爲阻止了對gen_tcp的調用:accept/1。是否仍可以通過指定接受超時來完成它?如果是這樣,我應該在哪裏接受accept()調用?
- 或者我應該從頭開始對它進行編碼(即:不使用一個存在的行爲),就像上面鏈接中的例子一樣?在這種情況下,我想到了一個調用gen_tcp的主循環:accept/2而不是gen_tcp:accept/1(即:指定超時),然後立即編寫接收塊,以便處理系統消息。這是正確的/可接受的嗎?
感謝提前:)
兩個答案都不能解決所描述的問題。兩者都使用'gen_server'來接收系統消息,但都將'accept''工作在工作進程之外。 trapexit文章使用'prim_inet:accept',這是一個內部的,未公開的API(如有更改,恕不另行通知)。 20位文章通過'proc_lib:spawn'生成一個手動接受(添加一個包裝,但不解決問題)。它們都避免了'gen_tcp:accept'的阻塞性質,但是釋放了對'accept'的控制並且需要清理(分別管理派生進程和不得不處理消息)。 – mlb
它通過解釋如何編寫一個特殊的過程來解決我的問題,該過程使用接受超時並接着處理系統消息,並且不使用未記錄的功能。我並沒有問如何寫一個非阻塞的接受,而且我也沒有產生另一個接受的過程。發佈在描述特殊過程的答案中的代碼是我在我的問題中詢問的其中一種可能性 – marcelog
在20bits或trapexit文章中,我沒有看到「accept」被超時使用。你能否更新你的答案,以顯示你發現的使用超時的鏈接?我會很樂意看到另一種方法,尤其是符合spec_proc的版本! – mlb