Какие операции в узле являются потокобезопасными?
Я используюэтот подход хранить данные в глобальном массиве, размещающем http-сервер, где определенные запросы будут манипулировать глобальным массивом.
Я немного волнуюсь из-за проблем с многопоточностью при определенных операциях - главным образомpush
а такжеsplice
, Я представляю, если в одном запросе я итерирую по массиву и удаляю элементы на основе условия, в то время как в другом запросе я вызываю.push()
в массиве, с которым у меня возникнут проблемы. Кто-нибудь может это подтвердить?
Я в основном пишу на C #, где даже простое приращение не является потокобезопасным (запуск 25 потоков, выполняющих i ++, не гарантирует, что i == 25 после того, как все сказано и сделано).
Update:
Я написал 5 примеров, чтобы продемонстрировать то, о чем я говорю. Тест 1 и Тест 3 работают нормально. Тест 2 завершается неудачей из-за ... того, что обычно называют проблемами потоков (независимо от того, являются ли они фактическими процессорами или нет) Тесты 4 и 5, когда они выполняются параллельно, похоже, работают (это означает, что у них нет проблем со столкновениями, таких как Тест 2).
Я использую ApacheBench для тестирования, делая 1000 параллельных запросов.
Это заставляет меня поверить, что Тест 1 и Тест 3 работают нормально, потому что nodejs не выполнит больше 1instance of the app.get('/test3'...)
callback in parallel Функция JavaScript параллельно (блокировка?). Как только вы реализуете setInterval / setTimeout, он освобождает nodejs для выполнения другого экземпляра обратного вызова (неблокирующего?).
Я просто пытаюсь понять, какого чертаnon-blocking I/O model
действительно значит. Означает ли это, что «можно сделать неблокирование с помощью setTimeout и setInterval, если вам нужна неблокировка, в противном случае мы будем блокировать запуск любых других функций внешнего уровня до тех пор, пока мы не исчерпаем функцию, которую мы»; на & quot ;? Я чувствую, что это необходимо знать, чтобы у меня не возникало проблем с мыслью, что я могу реализовать что-то вроде / test2 и быть в полной безопасности.
Также, если я пытаюсь быть неблокирующим с моими обратными вызовами, должен ли я действительно звонитьsetTimeout(code, 1)
? Или есть лучший способ?