Я новичок в node и пытаюсь настроить экспресс-сервер. Сервер будет обрабатывать различные запросы и, если какой-либо из них не сработает, вызовет общую функцию сбоя, которая отправит электронное письмо. Если бы я делал это на чем-то вроде Java, я бы, вероятно, использовал что-то вроде синхронизированного блока и логическое значение, чтобы разрешить первый вход в код для отправки почты.
Есть ли что-нибудь вроде синхронизированного блока в Node? Я считаю, что node является однопоточным и имеет несколько вспомогательных потоков для обработки асинхронного кода / кода обратного вызова. Возможно ли, чтобы одна и та же строка кода могла выполняться в Node в одно и то же время?
Спасибо!
Что касается логического значения, позволяющего впервые войти в код, нам нужно будет увидеть ваш реальный код, чтобы понять, чего вы действительно пытаетесь достичь.





Can the same line of Node.js code run at the same time? Is it at all possible that the same line of code could run at exactly the same time in Node?
Нет это не так. Ваш Javascript в node.js полностью однопоточный. Событие извлекается из очереди событий. Это вызывает обратный вызов, связанный с этим событием. Этот обратный вызов выполняется до тех пор, пока не вернется. Никакие другие события не могут быть обработаны, пока не вернется первое. Когда он возвращается, интерпретатор извлекает следующее событие из очереди событий и затем вызывает связанный с ним обратный вызов.
Это не означает, что в node.js. нет проблем с параллелизмом. Может быть, но это вызвано не тем, что код работает в одно и то же физическое время и создает конфликтующий доступ к общим переменным (как это может происходить в многопоточных языках, таких как Java). Проблемы с параллелизмом могут быть вызваны асинхронным характером ввода-вывода в node.js. В асинхронном случае вы вызываете асинхронную функцию, передаете ей обратный вызов (или ожидаете обещания взамен). Затем ваш код продолжается и возвращается к интерпретатору. Через некоторое время внутри нативного кода node.js произойдет событие, которое добавит что-то в очередь событий. Когда интерпретатор свободен от запуска другого Javascript, он обработает это событие, а затем вызовет ваш обратный вызов, что приведет к запуску большей части вашего кода.
Пока все это «в процессе», другие события могут выполняться бесплатно, а другие части вашего Javascript могут выполняться. Таким образом, проблема параллелизма возникает не из-за одновременного выполнения двух частей кода, а из-за того, что одна часть вашего кода работает, в то время как другая часть вашего кода ожидает обратного вызова. Обе части кода «в процессе». Они не «выполняются» одновременно, но обе операции ожидают выполнения чего-то еще, чтобы завершить их. Если эти две операции обращаются к переменным способами, которые могут конфликтовать друг с другом, то у вас может возникнуть проблема параллелизма в Javascript. Поскольку ничто из этого не является упреждающим (как потоки в Java), все это очень предсказуемо и для него гораздо проще спроектировать.
Is there anything like a synchronized block in Node?
Нет, нет. Это просто не нужно в вашем коде Javascript. Если вы хотите защитить что-то от какой-либо другой асинхронной операции, изменяющей это, в то время как ваша собственная асинхронная операция ожидала завершения, вы можете использовать простые флаги или переменные в своем коде. Поскольку приоритетного прерывания нет, простой флаг будет работать нормально.
I believe node is single threaded and has a few helper threads to handle asyncronous/callback code.
Node.js запускает ваш Javascript как однопоточный. Внутри своего собственного нативного кода он действительно использует потоки для выполнения своей работы. Например, код доступа к асинхронной файловой системе, внутренний для node.js, использует потоки для дискового ввода-вывода. Но эти потоки являются только внутренними, и результатом этих потоков является не прямой вызов Javascript, а вставка событий в очередь событий, и весь ваш Javascript сериализуется через очередь событий. Извлечь событие из очереди событий, запустить обратный вызов, связанный с событием. Подождите, пока этот обратный вызов вернется. Вытащить следующее событие из очереди событий, повторить ...
The server will handle various requests and if any of them fail call a common failure function that will send e-mail. If I was doing this in something like Java I'd likely use something like a synchronized block and a boolean to allow the first entrance into the code to send the mail.
Нам действительно нужно посмотреть, как выглядит ваш код, чтобы понять, какую именно проблему вы пытаетесь решить. Я предполагаю, что вы можете просто использовать простую логическую переменную (обычную переменную) в node.js, но нам нужно увидеть ваш код, чтобы действительно понять, что вы делаете.
@JohnCrux - Это то, что вы хотели знать?
Можете привести конкретный пример? Это может быть сложный ответ. Узел является однопоточный, но есть механизмы для введения multiобработка, о которых вы, возможно, спрашиваете.