首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Erlang gen_server start_link如何成为另一个节点上的gen_server?

Erlang gen_server start_link如何成为另一个节点上的gen_server?
EN

Stack Overflow用户
提问于 2012-09-12 17:38:05
回答 2查看 2.5K关注 0票数 1

我有一个Erlang应用程序,它太缺乏资源了,无法停留在一个节点上。我正在使gen_servers从一个进程转移到另一个进程--这是相对容易的。我面临最后一个障碍:获取创建这些gen_servers的工厂进程,以便在远程节点而不是本地节点上生成它们。显然,start_link的默认行为是只在本地启动,但我没有看到任何改变该行为的选项。

看来我必须在解决方案上具有创造性,并想看看是否有人已经成功地实现了这样的东西。建议的解决方案是什么?

编辑

我正在查看由调用触发的一连串呼叫:

代码语言:javascript
运行
复制
gen_server:start_link(?Module, Args, [])

gen_server:start_link/3:

代码语言:javascript
运行
复制
start_link(Mod, Args, Options) ->
    gen:start(?MODULE, link, Mod, Args, Options).

gen:开始/5:

代码语言:javascript
运行
复制
start(GenMod, LinkP, Mod, Args, Options) ->
    do_spawn(GenMod, LinkP, Mod, Args, Options).

gen:do_产卵/5:

代码语言:javascript
运行
复制
do_spawn(GenMod, link, Mod, Args, Options) ->
    Time = timeout(Options),
    proc_lib:start_link(?MODULE, init_it,
                        [GenMod, self(), self(), Mod, Args, Options], 
                        Time,
                        spawn_opts(Options));

proc_lib:start_link/5:

代码语言:javascript
运行
复制
start_link(M,F,A,Timeout,SpawnOpts) when is_atom(M), is_atom(F), is_list(A) ->
    Pid = ?MODULE:spawn_opt(M, F, A, ensure_link(SpawnOpts)),
    sync_wait(Pid, Timeout).

,这终于让我们看到了有趣的地方。有一个spawn_opt/4,它匹配:

代码语言:javascript
运行
复制
spawn_opt(M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) ->
    ...
    ...

但是,有一个对我来说是有用的:

代码语言:javascript
运行
复制
spawn_opt(Node, M, F, A, Opts) when is_atom(M), is_atom(F), is_list(A) ->
    ...
    ...

这件事没有暴露在我的脑海中。我意识到,一个粗心大意的程序员可能会试图在erlang节点上运行一个进程,这个进程恰好运行在火星上,阻塞了半个小时的呼叫,但这肯定是程序员的注意。我真的被困在修改OTP或编写某种临时解决方案了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-13 07:37:25

我们不直接在远程节点上start_link服务器。为了具有良好的程序结构和简单性,我们在远程节点上启动一个单独的应用程序,并将远程进程的创建委托给运行在远程应用程序中的某个进程。

由于与流程的链接主要是为了监督或监视,所以我们更喜欢与本地主管进行连接,而不是远程过程。如果您需要任何远程进程的活跃状态,我建议使用erlang:monitorerlang:demonitor

典型的分布式设置:

代码语言:javascript
运行
复制
Node1
+---------------+                          Node2
| App1          |                          +---------------+
|   Supervisor1 |  Proc Creation Request   | App2          |
|     Processes | -----------------------> |   Supervisor2 |
|     ......    |                          |      |
|     ......    |                          |      | Create Children
|     ......    |       Monitor            |      V
|     ......    | -----------------------> |     Processes |
+---------------+                          |     ......    |
                                           +---------------+
票数 6
EN

Stack Overflow用户

发布于 2012-09-13 01:00:12

也许rpc模块可以帮助您。特别是功能打电话

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12393568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档