在 Erlang 中,gen_server:start() 和 gen_server:start_link() 有什么区别?
In Erlang, what's the difference between gen_server:start() and gen_server:start_link()?
有人可以解释一下 gen_server:start()
和 gen_server:start_link()
之间的区别吗?
有人告诉我这是关于多线程的东西。
编辑:
如果我的 gen_server 被多个线程调用,它会同时执行它们吗?或者它会在这些线程之间创建并发吗?
当您使用 gen_server:start_link
时,新进程成为调用进程的 "child" - 它是 监督树 的一部分。它允许在 gen_server 进程死亡时通知调用进程。
使用gen_server:start
将在监督树之外生成进程。
Erlang 中关于监督的精彩描述如下:http://learnyousomeerlang.com/supervisors
这两个函数都启动新的gen_server
实例作为调用进程的子进程,但它们的不同之处在于gen_server:start_link/3,4
atomically starts a gen_server
child and links it to its parent process. Linking means that if the child dies, the parent will by default also die. 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:start()
和 gen_server:start_link()
之间的区别吗?
有人告诉我这是关于多线程的东西。
编辑: 如果我的 gen_server 被多个线程调用,它会同时执行它们吗?或者它会在这些线程之间创建并发吗?
当您使用 gen_server:start_link
时,新进程成为调用进程的 "child" - 它是 监督树 的一部分。它允许在 gen_server 进程死亡时通知调用进程。
使用gen_server:start
将在监督树之外生成进程。
Erlang 中关于监督的精彩描述如下:http://learnyousomeerlang.com/supervisors
这两个函数都启动新的gen_server
实例作为调用进程的子进程,但它们的不同之处在于gen_server:start_link/3,4
atomically starts a gen_server
child and links it to its parent process. Linking means that if the child dies, the parent will by default also die. Supervisors是父进程,当它们的子进程异常退出时,使用链接来采取特定的行动,通常会重新启动它们。
除了 gen_server:start_link
案例中涉及的链接之外,这些调用中没有涉及多进程方面。无论您是使用 gen_server:start
还是 gen_server:start_link
来启动一个新的 gen_server
,新进程都有一个消息队列,并且它一次接收和处理这些消息。 gen_server:start_link
不会导致新的 gen_server
进程的行为或执行方式与从 gen_server:start
开始时不同。