使用未注册的,动态创建的gen_server的示例?

时间:2010-02-12 21:17:34

标签: erlang otp

使用在OTP应用程序中命名的gen_servers的教程非常多。但是,我一直无法找到动态生成未注册(未命名)的服务器的好例子。有人能指出一个好的,简单的例子吗?例如,不是ejabberd,有很多东西要混淆我想要达到的核心理念。

感谢。

3 个答案:

答案 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进程。