在 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 开始时不同。