在Erlang中,gen_server:start()和gen_server:start_link()之间有什么区别?

Gug*_*dze 7 erlang erlang-otp gen-server

有人可以解释gen_server:start()和之间的区别是gen_server:start_link()什么?

我被告知这是多线程的东西.

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

Ste*_*ski 11

这两个函数gen_server都以调用进程的子进程的形式启动新实例,但它们的不同之处在于gen_server:start_link/3,4原子地启动gen_server进程并将其链接到其父进程.链接意味着如果孩子死亡,父母将默认死亡.主管是父进程,当子进程异常退出时,使用链接执行特定操作,通常是重新启动它们.

除了gen_server:start_link案例中涉及的链接之外,这些调用中不涉及多进程方面.无论您是使用gen_server:start还是gen_server:start_link启动gen_server新进程,新进程都有一个消息队列,它一次接收和处理这些消息.没有什么gen_server:start_link可以导致新gen_server进程的行为或执行方式与启动时不同gen_server:start.


Nov*_*kov 5

当您使用gen_server:start_link新流程时,它将成为调用流程的“子级”,它是监督树的一部分。如果gen_server进程终止,它允许通知调用进程。

使用gen_server:start将在监视树之外生成进程。

有关Erlang监管的详细说明,请参见:http : //learnyousomeerlang.com/supervisors

  • Erlang不使用术语“线程”。它称为“过程”。如果多个进程调用同一个gen_server,则它们的请求将被放入队列并一个接一个地处理。在http://learnyousomeerlang.com/content上,有关OTP的部分非常好 (4认同)