Может ли одна и та же строка кода Node.js выполняться одновременно? - PullRequest
0 голосов
/ 07 сентября 2018

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

Есть ли что-нибудь вроде синхронизированного блока в Node? Я считаю, что узел является однопоточным и имеет несколько вспомогательных потоков для обработки асинхронного / обратного вызова кода. Возможно ли, чтобы одна и та же строка кода могла выполняться в одно и то же время в Node?

Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2018

Может ли одна и та же строка кода Node.js выполняться одновременно? Возможно ли вообще, чтобы одна и та же строка кода могла выполняться в одно и то же время в Node?

Нет, это не так. Ваш Javascript в node.js полностью однопоточный. Событие извлекается из очереди событий. Это вызывает обратный вызов, связанный с этим событием. Этот обратный вызов выполняется, пока не вернется. Никакие другие события не могут быть обработаны, пока не вернется первое Когда он возвращается, интерпретатор извлекает следующее событие из очереди событий и затем вызывает связанный с ним обратный вызов.

Это не означает, что в node.js. нет проблем с параллелизмом. Может быть, но это вызвано не тем, что код выполняется в одно и то же физическое время и создает конфликтующий доступ к общим переменным (как это может случиться в многопоточных языках, таких как Java). Проблемы параллелизма могут быть вызваны асинхронной природой ввода-вывода в node.js. В асинхронном случае вы вызываете асинхронную функцию, передаете ей обратный вызов (или ожидаете обещание в ответ). Затем ваш код продолжается и возвращается к интерпретатору. Через некоторое время в собственном коде node.js произойдет событие, которое добавит что-то в очередь событий. Когда интерпретатор свободен от запуска другого Javascript, он обработает это событие и затем вызовет ваш обратный вызов, что приведет к запуску большего количества кода.

Пока все это «в процессе», другие события могут запускаться бесплатно, и другие части вашего Javascript могут запускаться. Таким образом, проблема с параллелизмом возникает не из-за одновременного запуска двух частей кода, а из-за того, что один фрагмент вашего кода работает, а другой фрагмент кода ожидает обратного вызова. Обе части кода находятся «в процессе». Они не «работают» в одно и то же время, но обе операции ждут, пока что-то еще произойдет, чтобы завершиться. Если эти две операции обращаются к переменным таким образом, что они могут конфликтовать друг с другом, у вас может возникнуть проблема параллелизма в Javascript. Поскольку все это не имеет преимущественного значения (как потоки в Java), все это очень предсказуемо и его гораздо проще спроектировать.

Есть ли что-нибудь похожее на синхронизированный блок в Node?

Нет, нет. Это просто не нужно в вашем коде Javascript. Если вы хотите защитить что-то от какой-либо другой асинхронной операции, изменив ее, пока ваша собственная асинхронная операция ожидает завершения, вы можете использовать простые флаги или переменные в своем коде. Поскольку нет вытеснения, простой флаг будет работать очень хорошо.

Я считаю, что узел является однопоточным и имеет несколько вспомогательных потоков для обработки асинхронного кода / кода обратного вызова.

Node.js запускает ваш Javascript как однопоточный. Внутренне в своем собственном нативном коде он использует потоки для выполнения своей работы. Например, код доступа к асинхронной файловой системе, внутренний для node.js, использует потоки для дискового ввода-вывода. Но эти потоки являются только внутренними, и результатом этих потоков является не прямой вызов Javascript, а вставка событий в очередь событий, и весь ваш Javascript сериализуется через очередь событий. Извлечь событие из очереди событий, запустить обратный вызов, связанный с событием. Подождите, пока этот обратный вызов вернется. Извлечь следующее событие из очереди событий, повторить ...

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

Нам действительно нужно посмотреть, как выглядит ваш код, чтобы понять, какую именно проблему вы пытаетесь решить. Я предполагаю, что вы можете просто использовать простую логическую (обычную переменную) в файле node.js, но мы должны увидеть ваш код, чтобы действительно понять, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...