2013-06-14 2 views
1

Dans node.js, si mon thread appelle une bibliothèque de blocage, il ne peut plus accepter de demandes tant qu'il ne reçoit pas de réponse de la bibliothèque. Est-ce la même situation avec la machine virtuelle Erlang - c'est-à-dire, d'autres processus peuvent-ils continuer à accepter des demandes si l'un des processus appelle une bibliothèque bloquante?Appel d'une bibliothèque de blocage dans node.js vs erlang vm

Répondre

5

Dans Erlang, un processus peut bloquer, mais le planificateur Erlang pas bloc. D'autres processus continueront à être exécutés/donnés par le planificateur. Certains appels comme erlang:now bloquent tous pendant très peu de temps, mais il existe des alternatives non bloquantes. Si je me souviens bien, Ericson travaille dur pour enlever toutes les choses bloquantes de la machine virtuelle Erlang. et la plupart des blocs sont des cas-bords subtils. Par exemple: dans R16, la dernière version, ils ont corrigé les mises à niveau bloquantes du code à chaud.

Voir aussi ERLANG wait() and blocking

2

Oui, vous pouvez accepter des demandes avec un processus et effectuer des appels pour bloquer la bibliothèque avec d'autres. Que voulez-vous accomplir? Si c'est quelque chose comme: « premier client envoyer des données au serveur et attend la réponse, mais le serveur n'a pas de blocage et peut accepter la demande d'autres clients », vous pouvez le faire quelque chose comme ceci (par exemple avec le comportement de 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}. 
+0

Je voulais vérifier que dans le cas où je dois faire un appel à une bibliothèque de blocage, il n'affectera ce processus, et non mettre un terme à l'ensemble du serveur. L'avertissement le plus répété dans les ressources de node.js est de faire preuve d'une extrême prudence pour ne pas appeler une bibliothèque/fonction bloquante, ou cela arrêtera tout votre serveur. Si ce n'est pas le cas chez Erlang, et que le serveur peut continuer à interagir avec les clients, c'est un gros point en faveur d'Erlang sur node.js – tldr

+0

oui, cela ne fera qu'arrêter le processus appelant. – couchemar

+0

L'aspect important ici est le point central d'Erlang: les processus peuvent être préemptés s'ils devaient bloquer. Node.js est extrêmement coopératif, et par conséquent il a besoin de vous pour éviter explicitement le blocage. Un grand soin a été pris pour s'assurer que la VM Erlang reste réactive même si un processus n'appelle pas une fonction qui bloque, ou si un processus prend trop de temps à exécuter un processus donné sur les cœurs. –