1

在 node.js 中,如果我的线程调用了一个阻塞库,它就不能再接受任何请求,直到它从库中得到响应。这与 Erlang 虚拟机的情况是否相同 - 即,如果其中一个进程调用阻塞库,其他进程能否继续接受请求?

4

2 回答 2

5

在 Erlang 中,进程可能会阻塞,但 Erlang 调度程序不会阻塞。其他进程将继续由调度程序执行/给定时间。有一些像erlang:now这样的调用会在很短的时间内全部阻塞,但也有非阻塞的替代方案。如果我没记错的话,Ericson 正在努力从 Erlang VM 中删除所有阻塞的东西。大多数块都是微妙的边缘情况。例如:在最后一个版本 R16 中,他们修复了阻塞热代码升级。

另请参阅ERLANG wait() 和阻塞

于 2013-06-14T08:44:09.110 回答
2

是的,您可以用一个进程接受请求,并用另一个进程调用阻塞库。你想达到什么目标?如果它是这样的:“第一个客户端向服务器发送数据,并等待应答,但服务器没有阻塞并且可以接受来自其他客户端的请求”,你可以这样做(以 gen_server 行为为例):

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}.
于 2013-06-14T06:08:32.233 回答