有人可以解释gen_server:start()
和gen_server:start_link()
之间有什么区别吗?在Erlang中,gen_server:start()和gen_server:start_link()有什么区别?
我被告知这是关于多线程的东西。
编辑: 如果我的gen_server从多个线程被调用,它会一次执行它们吗?或者它会在这些线程之间创建并发性?
有人可以解释gen_server:start()
和gen_server:start_link()
之间有什么区别吗?在Erlang中,gen_server:start()和gen_server:start_link()有什么区别?
我被告知这是关于多线程的东西。
编辑: 如果我的gen_server从多个线程被调用,它会一次执行它们吗?或者它会在这些线程之间创建并发性?
两个函数启动新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:start_link
新过程成为调用过程的“子” - 它是监督树的一部分。它允许在gen_server进程死亡的情况下通知进程。
使用gen_server:start
会在监督树之外产生进程。
二郎监督尼斯的描述是在这里:http://learnyousomeerlang.com/supervisors
如果我的genserver是从多个线程调用的,它会一次执行它们吗?或者它会在这些线程之间创建并发性? –
谢谢你的回答,你能回答我吗? –
Erlang不使用术语“线程”。它被称为“过程”。如果多个进程调用相同的gen_server,则他们的请求将被放入队列中并逐个处理。在http://learnyousomeerlang.com/content上有关于OTP的非常好的部分 – Novakov
请看编辑Steve。 –
我已经回答了您的修改内容。如果多个进程同时调用你的'gen_server',它们的消息在'gen_server'消息队列中排队,'gen_server'则一次处理这些消息。 –