Welche Operationen in Node sind threadsicher?

Ich benutzedieser Ansatz zum Speichern von Daten in einem globalen Array, das einen HTTP-Server hostet, auf dem bestimmte Anforderungen das globale Array manipulieren.

Ich mache mir Sorgen, dass ich bei bestimmten Operationen auf Threading-Probleme stoße - hauptsächlichpush undsplice. Ich stelle mir vor, dass ich bei einer Anfrage über das Array iteriere und Elemente basierend auf einer Bedingung entferne, während ich bei einer anderen Anfrage anrufe.push() auf dem Array, dass ich auf Probleme stoßen werde. Kann das jemand bestätigen?

Ich schreibe meistens in C #, wo selbst ein einfaches Inkrement nicht threadsicher ist (das Starten von 25 Threads, die i ++ ausführen, garantiert nicht, dass i == 25 schließlich gesagt und getan wird).

Aktualisieren:

Ich habe 5 Beispiele geschrieben, um zu demonstrieren, wovon ich spreche. Test 1 und Test 3 funktionieren einwandfrei. Test 2 schlägt fehl, weil ... was normalerweise als Threading-Probleme bezeichnet wird (ob es sich um tatsächliche CPU-Threads handelt oder nicht). Test 4 und 5, wenn sie parallel laufen, scheinen zu funktionieren (was bedeutet, dass sie keine Kollisionsprobleme wie Test 2 haben).

http://pastebin.com/HcJHTDFY

Ich benutze ApacheBench zum Testen und stelle 1000 parallele Anfragen.

Dies lässt mich glauben, dass Test 1 und Test 3 gut funktionieren, da nodejs nicht mehr als 1 ausführenInstanz derapp.get('/test3'...) Rückruf parallel Javascript-Funktion parallel (Sperrung?). Sobald Sie ein setInterval / setTimeout implementieren, werden nodejs für die Ausführung einer weiteren Instanz des Rückrufs freigegeben (nicht blockierend?).

Ich versuche wirklich nur zu verstehen, was zum Teufel istnon-blocking I/O model bedeutet wirklich. Bedeutet dies, dass "hey, es ist möglich, mit setTimeout und setInterval nichts zu blockieren, wenn Sie nichts zu blockieren brauchen, andernfalls werden wir alle anderen Funktionen der äußeren Ebene daran hindern, ausgeführt zu werden, bis wir die Funktion, in der wir uns befinden, erschöpfen" ? Ich halte es für unerlässlich, dies zu wissen, damit ich nicht in Schwierigkeiten gerate und denke, ich könnte etwas wie / test2 implementieren und absolut sicher sein.

Auch wenn ich versuche, meine Rückrufe nicht zu blockieren, sollte ich wirklich anrufensetTimeout(code, 1)? Oder gibt es einen besseren Weg?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage