【发布时间】:2016-11-14 14:19:18
【问题描述】:
有人能解释一下gen_server:start() 和gen_server:start_link() 之间的区别吗?
有人告诉我这是关于多线程的东西。
编辑: 如果我的 gen_server 从多个线程调用,它会一次执行它们吗?还是会在这些线程之间创建并发?
【问题讨论】:
标签: erlang erlang-otp gen-server
有人能解释一下gen_server:start() 和gen_server:start_link() 之间的区别吗?
有人告诉我这是关于多线程的东西。
编辑: 如果我的 gen_server 从多个线程调用,它会一次执行它们吗?还是会在这些线程之间创建并发?
【问题讨论】:
标签: erlang erlang-otp gen-server
当您使用gen_server:start_link 时,新进程将成为调用进程的“子” - 它是监督树的一部分。如果 gen_server 进程死亡,它允许通知调用进程。
使用gen_server:start 将在监督树之外生成进程。
Erlang 中关于监督的很好的描述在这里:http://learnyousomeerlang.com/supervisors
【讨论】:
两个函数都作为调用进程的子进程启动新的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 启动时不同。
【讨论】:
gen_server,它们的消息将在gen_server 消息队列中排队,gen_server 一次处理这些消息。