在node.js与erlang vm中调用阻塞库

在node.js与erlang vm中调用阻塞库,node.js,erlang,blocking,nonblocking,Node.js,Erlang,Blocking,Nonblocking,在node.js中,如果我的线程调用了一个阻塞库,它将无法接受更多的请求,直到它从库中得到响应。Erlang虚拟机的情况是否与此相同?即,如果其中一个进程调用阻塞库,其他进程是否可以继续接受请求 是的,您可以用一个进程接受请求,用另一个进程调用阻塞库。 你想要实现什么?如果是这样的:“第一个客户端向服务器发送数据,并等待应答,但服务器不阻塞,可以接受其他客户端的请求”,您可以这样做(gen_服务器行为示例): 是的,您可以用一个进程接受请求,用另一个进程调用阻塞库。 你想要实现什么?如果是这样的

在node.js中,如果我的线程调用了一个阻塞库,它将无法接受更多的请求,直到它从库中得到响应。Erlang虚拟机的情况是否与此相同?即,如果其中一个进程调用阻塞库,其他进程是否可以继续接受请求

是的,您可以用一个进程接受请求,用另一个进程调用阻塞库。 你想要实现什么?如果是这样的:“第一个客户端向服务器发送数据,并等待应答,但服务器不阻塞,可以接受其他客户端的请求”,您可以这样做(gen_服务器行为示例):


是的,您可以用一个进程接受请求,用另一个进程调用阻塞库。 你想要实现什么?如果是这样的:“第一个客户端向服务器发送数据,并等待应答,但服务器不阻塞,可以接受其他客户端的请求”,您可以这样做(gen_服务器行为示例):


在Erlang中,进程可能会阻塞,但Erlang调度程序不会阻塞。其他进程将继续由调度器执行/给定时间。有一些调用,比如
erlang:now
,可以在很短的时间内阻止所有调用,但也有非阻塞的替代方法。如果我没记错的话,Ericson正在努力从ErlangVM中删除所有阻塞内容。大多数块都是细微的边缘情况。例如:在R16上一个版本中,他们修复了阻止热代码升级的问题


另请参见Erlang中的

,进程可能会阻塞,但Erlang调度程序不会阻塞。其他进程将继续由调度器执行/给定时间。有一些调用,比如
erlang:now
,可以在很短的时间内阻止所有调用,但也有非阻塞的替代方法。如果我没记错的话,Ericson正在努力从ErlangVM中删除所有阻塞内容。大多数块都是细微的边缘情况。例如:在R16上一个版本中,他们修复了阻止热代码升级的问题


另请参见

我想验证一下,如果我必须调用阻塞库,它只会影响该进程,而不会停止整个服务器。在node.js参考资料中,最重复的警告是要格外小心,不要调用阻塞库/函数,否则它将停止整个服务器。如果在Erlang中不是这样,并且服务器可以继续与客户机交互,那么这是Erlang优于node.js的一个重要方面这里的重要方面是Erlang的中心点:如果进程阻塞,则可以抢占它们。Node.js非常协作,因此需要您显式避免阻塞。我们非常小心地确保Erlang VM保持响应,即使某个进程没有调用会阻塞的函数,或者某个进程在内核上运行给定的进程需要很长时间。我想验证一下,如果我必须调用阻塞库,它只会影响该进程,而不会停止整个服务器。在node.js参考资料中,最重复的警告是要格外小心,不要调用阻塞库/函数,否则它将停止整个服务器。如果在Erlang中不是这样,并且服务器可以继续与客户机交互,那么这是Erlang优于node.js的一个重要方面这里的重要方面是Erlang的中心点:如果进程阻塞,则可以抢占它们。Node.js非常协作,因此需要您显式避免阻塞。我们非常小心地确保Erlang VM保持响应,即使进程没有调用会阻塞的函数,或者进程在内核上运行给定进程花费的时间太长。
handle_call(ClientRequest, From, State) ->
    %% make call to blocking library
    %% for the simplicity use spawn_link
    MyPid = self(),
    _Pid = spawn_link(fun() -> %% blocking data processing
                           ...
                           Result = ...
                           %% send reply back to server.
                           %% From -- using for answer to clients
                           gen_server:cast(MyPid, {reply, From, Result})
                       end)
    %% tell client wait for answer.
    {noreply, State}.

handle_cast({reply, To, Data}, State) ->
    %% send reply back to client
    gen_serve:reply(To, Data),
    {noreply, State}.