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).
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?