【问题标题】:In Erlang, what's the difference between gen_server:start() and gen_server:start_link()?在 Erlang 中,gen_server:start() 和 gen_server:start_link() 有什么区别?
【发布时间】:2016-11-14 14:19:18
【问题描述】:

有人能解释一下gen_server:start()gen_server:start_link() 之间的区别吗?

有人告诉我这是关于多线程的东西。

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

【问题讨论】:

    标签: erlang erlang-otp gen-server


    【解决方案1】:

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

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

    Erlang 中关于监督的很好的描述在这里:http://learnyousomeerlang.com/supervisors

    【讨论】:

    • 如果我的 genserver 被多个线程调用,它会一次执行它们吗?还是会在这些线程之间创建并发?
    • 感谢您的回答,您也可以回答我吗?
    • Erlang 不使用术语“线程”。它被称为“过程”。如果多个进程调用同一个gen_server,它们的请求将被放入队列并一个接一个地处理。在learnyousomeerlang.com/content 上有关于 OTP 的非常好的部分
    【解决方案2】:

    两个函数都作为调用进程的子进程启动新的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 一次处理这些消息。
    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2016-08-12
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多