2010-02-12 50 views
4

教程很多與在OTP應用程序中命名的gen_servers一起使用。但是,我一直無法找到一個動態生成未註冊(未命名)的服務器的好例子。有人能指出一個好的簡單例子嗎?例如,不是ejabberd,其中有很多內容混淆了我正在努力研究的核心思想。使用未註冊的動態創建的gen_server的示例?

謝謝。

回答

1

我在http://github.com/noss/iserve的督導樹上進行了一些動態產卵工作。 iserve應用程序有一個主註冊過程,我呼叫iserve_master它與一個簡單的模式監督員一起監督。

iserve_master用於要求iserve啓動http服務器。它可以有多個iservers,只要它們綁定到唯一的地址。雖然啓動的服務器爲自己構建了一個名稱,但是爲了簡化調試,它使用端口名稱生成一個原子。

服務器是一個「永恆」循環,等待iserve_socket回電接受連接。它在init中啓動第一個。

啓動的套接字不受監視,因爲無論如何它都無法重新啓動而不會丟失http套接字連接。而且我認爲這是一個不關心的功能。火和忘記。

它遠非完美,但我有點喜歡的建築。

0

rabbitmq-shovel plugin似乎有一個例子 - 請參閱rabbit_shovel_sup.erl和rabbit_shovel_worker.erl。它根據配置文件中的設置生成工作者gen_server進程。

2

最簡單的例子是:
離開了第一個參數{本地,名}在gen_server:開始: 即假設你的模塊被稱爲MOD

start(ArgX) -> 
    gen_server:start(mod, [ArgX], []). 

然後你做:

> {ok, Pid} = gen_server:start(mod, [66], []). 

並且gen_server已啓動並正在運行。
每次調用此函數都會產生一個新的未命名的gen_server進程。 請注意,此示例使用開始(而不是開始鏈接)爲獨立使用(監督員上下文以外)。