Was ist eine blockierende Funktion?

8

Dies ist ein Begriff, den ich immer wieder in Bezug auf Echtzeitverarbeitungssprachen sehe. In diesem speziellen Fall lese ich die node.js Homepage und es hat dieses Zitat:

"In anderen Systemen gibt es immer einen blockierenden Aufruf, um die Ereignisschleife zu starten."

Was ist ein blockierender Anruf?

    
cjm2671 13.09.2011, 19:12
quelle

3 Antworten

13

Eine Funktion, die die Skriptausführung stoppt, bis sie endet.

Wenn ich zum Beispiel eine Funktion in meiner Sprache hatte, die zum Schreiben in eine Datei verwendet wurde:

%Vor%

Die Anweisung print wird nur ausgeführt, wenn die Datei auf den Datenträger geschrieben wurde. Das ganze Programm ist auf dieser Anweisung angehalten . Dies ist bei kleinen Schreibvorgängen nicht bemerkbar, aber stellen Sie sich vor, ich hätte einen riesigen Blob in die Datei schreiben müssen, der viele Sekunden in Anspruch genommen hätte:

%Vor%

Die Anweisung print würde nur nach einigen Sekunden des Schreibens ausgeführt werden und das gesamte Programm würde für diese Zeit gestoppt werden. In Node.js geschieht dies asynchron mit events und Callbacks . Unser Beispiel würde lauten:

%Vor%

Der dritte Parameter ist eine Funktion, die aufgerufen wird, sobald die Datei geschrieben wurde. Die print -Anweisung nach der Schreibfunktion würde unmittelbar danach aufgerufen werden, unabhängig davon, ob die Datei bereits geschrieben wurde oder nicht. Wenn wir also einen riesigen Blob schreiben würden, könnte die Ausgabe so aussehen:

%Vor%

Dies macht Anwendungen sehr schnell , weil Sie nicht auf eine Client-Nachricht, eine Datei schreiben oder andere warten. Sie können die Daten parallel weiterverarbeiten. Dies wird von vielen der Stärken von Node.js berücksichtigt.

    
Alex Turpin 13.09.2011, 19:14
quelle
2
%Vor%

Eine Sperrfunktion berechnet grundsätzlich für immer. Das bedeutet, dass es blockiert.

Andere blockierende Funktionen würden auf IO warten

Ein nicht blockierendes E / A-System bedeutet, dass eine Funktion eine E / A-Aktion startet, dann inaktiv wird und dann das Ergebnis der E / A-Aktion verarbeitet, wenn dies geschieht.

Es ist im Grunde der Unterschied zwischen einem Thread im Leerlauf und dem Schlafen.

    
Raynos 13.09.2011 19:14
quelle
0

Ein blockierender Aufruf ist ein Aufruf, bei dem die Verarbeitung nicht fortgesetzt werden kann, bis sie zum aufrufenden Thread zurückkehrt - dies wird auch als synchroner Aufruf bezeichnet. Asynchron bedeutet auf der anderen Seite, dass Threads (und Code) gleichzeitig (gleichzeitig) ausgeführt werden können.

    
Zunandi 13.09.2011 19:20
quelle

Tags und Links