在 node.js 中,如果我的线程调用了一个阻塞库,它就不能再接受任何请求,直到它从库中得到响应。这与 Erlang 虚拟机的情况是否相同 - 即,如果其中一个进程调用阻塞库,其他进程能否继续接受请求?
问问题
312 次
2 回答
5
在 Erlang 中,进程可能会阻塞,但 Erlang 调度程序不会阻塞。其他进程将继续由调度程序执行/给定时间。有一些像erlang:now
这样的调用会在很短的时间内全部阻塞,但也有非阻塞的替代方案。如果我没记错的话,Ericson 正在努力从 Erlang VM 中删除所有阻塞的东西。大多数块都是微妙的边缘情况。例如:在最后一个版本 R16 中,他们修复了阻塞热代码升级。
于 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 回答