Które operacje w węźle są bezpieczne dla wątków?

używamto podejście do przechowywania danych w globalnej tablicy obsługującej serwer http, gdzie pewne żądania będą manipulować tablicą globalną.

Martwię się, że w pewnych operacjach borykam się z problemami związanymi z wątkami - główniepush isplice. Wyobrażam sobie, że jeśli jedno żądanie powoduje, że wykonuję iterację po tablicy i usuwam elementy na podstawie warunkowej, podczas gdy inne żądanie wywołuje mnie.push() na tablicy, na którą natrafię na problemy. Czy ktoś może to potwierdzić?

Najczęściej piszę w C #, gdzie nawet prosty przyrost nie jest bezpieczny dla wątków (uruchomienie 25 wątków, które robią i ++, nie gwarantuje, że i == 25 po tym wszystkim zostało powiedziane i zrobione).

Aktualizacja:

Napisałem 5 przykładów, aby pokazać, o czym mówię. Test 1 i test 3 działają prawidłowo. Test 2 kończy się niepowodzeniem z powodu dobrze ... co normalnie nazywamy problemami z wątkami (czy są to rzeczywiste wątki procesora, czy nie). Test 4 i 5, gdy działają równolegle, wydają się działać (co oznacza, że ​​nie mają problemów z kolizją, takich jak Test 2).

http://pastebin.com/HcJHTDFY

Do testowania używam ApacheBench, tworząc 1000 równoległych żądań.

To prowadzi mnie do przekonania, że ​​Test 1 i Test 3 działają poprawnie, ponieważ nodejs nie wykonają więcej niż 1wystąpienieapp.get('/test3'...) wywołanie zwrotne równolegle funkcja javascript równolegle (blokowanie?). Jak tylko zaimplementujesz setInterval / setTimeout, zwalnia on nodejs, aby wykonać inną instancję wywołania zwrotnego (nie blokując?).

Naprawdę próbuję zrozumieć, co do cholerynon-blocking I/O model naprawdę znaczy. Czy to znaczy, że „hej jest możliwe, aby nie blokować za pomocą setTimeout i setInterval, jeśli potrzebujesz non-blocking, w przeciwnym razie zablokujemy uruchamianie innych funkcji na poziomie zewnętrznym, dopóki nie wyczerpamy funkcji, w której jesteśmy ? Uważam, że to konieczne, aby wiedzieć, że nie wpadam w kłopoty, myśląc, że mogę zaimplementować coś takiego jak / test2 i być całkowicie bezpiecznym.

Również jeśli próbuję nie blokować przy użyciu moich wywołań zwrotnych, czy naprawdę powinienem dzwonićsetTimeout(code, 1)? Czy jest jakiś lepszy sposób?

questionAnswers(2)

yourAnswerToTheQuestion