Ich benutze dieser Ansatz um Daten in einem globalen Array zu speichern, das einen http-Server hostet, auf dem bestimmte Anfragen das globale Array manipulieren.
Ich bin irgendwie besorgt über das Laufen in Threading Probleme mit bestimmten Operationen - vor allem push
et splice
. Ich stelle mir vor, dass ich bei einer Anfrage über das Array iterieren und Elemente auf der Grundlage einer Bedingung entfernen muss, während ich bei einer anderen Anfrage .push()
auf dem Array, dass ich auf Probleme stoßen werde. Kann jemand dies bestätigen?
Ich schreibe meist in C#, wo selbst ein einfaches Inkrement nicht thread-sicher ist (der Start von 25 Threads, die i++ ausführen, garantiert nicht, dass i == 25 ist).
Update :
Ich habe 5 Beispiele geschrieben, um zu zeigen, wovon ich spreche. Test 1 und Test 3 funktionieren gut. Test 2 schlägt fehl, weil... was man normalerweise als Threading-Probleme bezeichnen würde (ob es sich nun um tatsächliche CPU-Threads handelt oder nicht). Test 4 und 5, wenn sie parallel laufen, scheinen zu funktionieren (d.h. sie haben keine Kollisionsprobleme wie Test 2).
Ich verwende ApacheBench zum Testen und stelle 1000 parallele Anfragen.
Dies führt mich zu glauben, dass Test 1 und Test 3 gut funktionieren, weil nodejs nicht mehr als 1 ausführen wird Instanz des javascript-Funktion parallel (blockierend?). Sobald Sie ein setInterval/setTimeout implementieren, gibt es nodejs frei, um eine andere Instanz des Rückrufs auszuführen (nicht blockierend?).app.get('/test3'...)
paralleler Rückruf
Ich versuche wirklich nur zu verstehen, was zum Teufel non-blocking I/O model
wirklich bedeutet. Bedeutet es, dass "hey, es ist möglich, nicht-blockierende mit setTimeout und setInterval zu tun, wenn Sie nicht-blockierende benötigen, andernfalls werden wir blockieren alle anderen Funktionen der äußeren Ebene von ausgeführt werden, bis wir die Funktion, die wir auf erschöpfen"? Ich denke, es ist wichtig, dies zu wissen, damit ich mich nicht in Schwierigkeiten bringe, wenn ich denke, ich könnte etwas wie /test2 implementieren und wäre völlig sicher.
Auch wenn ich versuche, non-blocking mit meinen Rückrufen zu sein, sollte ich wirklich aufgerufen werden setTimeout(code, 1)
? Oder gibt es einen besseren Weg?