在node.js和erlang vm中调用一个阻塞库

在node.js中,如果我的线程调用了一个阻塞库,它将不能接受任何更多的请求,直到它从库中取回响应。 这与Erlang虚拟机的情况是否一样 – 也就是说,如果其中一个进程调用阻塞库,其他进程是否可以继续接受请求?

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

另请参阅ERLANG等待()和阻止

是的,您可以通过一个进程接受请求,并与其他进程阻塞库进行通话。 你想达到什么目的? 如果是这样的:“第一个客户端发送数据到服务器,并等待回答,但服务器不阻止,并可以接受来自其他客户端的请求”,你可以这样做(例如与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}.