使用在OTP应用程序中命名的gen_servers的教程非常多。但是,我一直无法找到动态生成未注册(未命名)的服务器的好例子。有人能指出一个好的,简单的例子吗?例如,不是ejabberd,有很多东西要混淆我想要达到的核心理念。
感谢。
答案 0 :(得分:2)
最简单的例子是:
在 gen_server:start 中省略第一个参数{local,name}:
即假设您的模块名为 mod :
start(ArgX) ->
gen_server:start(mod, [ArgX], []).
然后你做:
> {ok, Pid} = gen_server:start(mod, [66], []).
并且gen_server启动并运行。每次调用此函数都会产生一个新的未命名的gen_server进程。 请注意,此示例使用开始(而非 start_link )进行独立使用(在主管上下文之外)。
答案 1 :(得分:1)
我在http://github.com/noss/iserve的监督树中有一些工人的动态产卵。 iserve应用程序有一个主注册过程,我称之为iserve_master
,它与一个简单的一个模式主管一起受到监督。
iserve_master
用于询问iserve启动http服务器。它可以有多个iservers,只要它们绑定到唯一的地址。启动的服务器虽然为自己构造了一个名称,但是为了简化调试,它使用端口名称生成一个原子。
服务器是一个“永恒”循环,等待iserve_socket
回调接受连接。它在init中启动第一个。
启动的套接字没有受到监控,因为它无法在不丢失http套接字连接的情况下重新启动。我认为这是一个不在乎的功能。火与忘。
它远非完美,但我喜欢的架构。
答案 2 :(得分:0)
rabbitmq-shovel plugin似乎有一个例子 - 请参阅rabbit_shovel_sup.erl和rabbit_shovel_worker.erl。它根据配置文件中的设置生成工作者gen_server进程。