2016-07-12 29 views

回答

9

两个函数启动新gen_server实例作为调用进程的孩子,但他们的区别在于gen_server:start_link/3,4原子开始gen_server孩子它链接到它的父过程。链接意味着如果孩子死亡,家长默认也会死亡。 Supervisors是父进程,它们使用链接在其子进程异常退出时执行特定的操作,通常会重新启动它们。

除了在gen_server:start_link案件中涉及的链接之外,这些调用中不涉及多进程方面。不管您是使用gen_server:start还是使用gen_server:start_link来启动新的gen_server,新进程都有一个消息队列,并且它一次接收并处理这些消息。没有任何关于gen_server:start_link导致新的gen_server进程的行为或执行方式与以gen_server:start开始的行为不同。

+0

请看编辑Steve。 –

+1

我已经回答了您的修改内容。如果多个进程同时调用你的'gen_server',它们的消息在'gen_server'消息队列中排队,'gen_server'则一次处理这些消息。 –

4

当您使用gen_server:start_link新过程成为调用过程的“子” - 它是监督树的一部分。它允许在gen_server进程死亡的情况下通知进程。

使用gen_server:start会在监督树之外产生进程。

二郎监督尼斯的描述是在这里:http://learnyousomeerlang.com/supervisors

+0

如果我的genserver是从多个线程调用的,它会一次执行它们吗?或者它会在这些线程之间创建并发性? –

+0

谢谢你的回答,你能回答我吗? –

+4

Erlang不使用术语“线程”。它被称为“过程”。如果多个进程调用相同的gen_server,则他们的请求将被放入队列中并逐个处理。在http://learnyousomeerlang.com/content上有关于OTP的非常好的部分 – Novakov