教程很多与在OTP应用程序中命名的gen_servers一起使用。但是,我一直无法找到一个动态生成未注册(未命名)的服务器的好例子。有人能指出一个好的简单例子吗?例如,不是ejabberd,其中有很多内容混淆了我正在努力研究的核心思想。使用未注册的动态创建的gen_server的示例?
谢谢。
教程很多与在OTP应用程序中命名的gen_servers一起使用。但是,我一直无法找到一个动态生成未注册(未命名)的服务器的好例子。有人能指出一个好的简单例子吗?例如,不是ejabberd,其中有很多内容混淆了我正在努力研究的核心思想。使用未注册的动态创建的gen_server的示例?
谢谢。
我在http://github.com/noss/iserve的督导树上进行了一些动态产卵工作。 iserve应用程序有一个主注册过程,我呼叫iserve_master
它与一个简单的模式监督员一起监督。
iserve_master
用于要求iserve启动http服务器。它可以有多个iservers,只要它们绑定到唯一的地址。虽然启动的服务器为自己构建了一个名称,但是为了简化调试,它使用端口名称生成一个原子。
服务器是一个“永恒”循环,等待iserve_socket
回电接受连接。它在init中启动第一个。
启动的套接字不受监视,因为无论如何它都无法重新启动而不会丢失http套接字连接。而且我认为这是一个不关心的功能。火和忘记。
它远非完美,但我有点喜欢的建筑。
rabbitmq-shovel plugin似乎有一个例子 - 请参阅rabbit_shovel_sup.erl和rabbit_shovel_worker.erl。它根据配置文件中的设置生成工作者gen_server进程。
最简单的例子是:
离开了第一个参数{本地,名}在gen_server:开始: 即假设你的模块被称为MOD:
start(ArgX) ->
gen_server:start(mod, [ArgX], []).
然后你做:
> {ok, Pid} = gen_server:start(mod, [66], []).
并且gen_server已启动并正在运行。
每次调用此函数都会产生一个新的未命名的gen_server进程。 请注意,此示例使用开始(而不是开始链接)为独立使用(监督员上下文以外)。