2010-02-12 48 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进程。 请注意,此示例使用开始(而不是开始链接)为独立使用(监督员上下文以外)。