Представьте, что вы управляете кассовым аппаратом в пекарне.Вы работаете со своими клиентами последовательно и синхронно, например:
- Примите заказ
- Скажите пекарю выпекать хлеб
- Подождите, пока хлеб не испечется
- Взимать деньги
- Доставить хлеб
- GOTO 1 - следующий клиент
Это будет очень медленно.Теперь попробуйте вместо этого принимать заказы последовательно, но обрабатывайте своих клиентов асинхронно:
- Примите заказ
- Скажите пекарю испечь хлеб и уведомить вас о завершении.При получении уведомления:
- Платные деньги
- Доставка хлеба
- GOTO 1 - следующий клиент
ОБНОВЛЕНИЕ: Я рефакторинг выше, так что это больше похоже на обратный вызов.Вы, кассир, сразу перейдете к шагу 3 после того, как отдадите заказ пекарю.Вы перейдете к шагу 2.1, когда пекарь уведомит вас о том, что хлеб готов.
Таким образом, вы все равно будете доставлять столько хлеба - вы можете продать столько хлеба, сколько выпекает ваш пекарь.Но вы можете работать с вашими клиентами более эффективно, потому что вместо ожидания ожидания возврата заказа вы начинаете обрабатывать следующего клиента.
Теперь вы можете заняться всеми видами фантазий,и начислять деньги заранее, и сказать клиенту, чтобы он взял хлеб на другом конце стола, или что-то в этом роде.Я думаю, что Starbucks довольно "выровнены" в этом смысле.Кассир принимает заказ, выдает несколько запросов на вещи и говорит клиенту подождать, пока все не окажется в зоне вывоза.Супер-эффективный.
Теперь представьте, что ваш друг начинает работать с другим кассовым аппаратом.Он следует вашему асинхронному примеру.Вы можете справиться с большим количеством клиентов, даже быстрее!Обратите внимание, что единственное, что вам нужно было сделать, - это отправить своего друга туда и передать ему ваш рабочий процесс.
Вы и ваш друг - это два однопоточных цикла событий, работающих параллельно.Это аналог двух процессов node.js, принимающих запросы.Вам не нужно ничего усложнять, чтобы распараллелить это, вы просто запускаете еще один цикл обработки событий.
Итак, нет, «перемещение операций в функции» не «автоматически порождает дочерние процессы».Они больше похожи на сигналы тревоги - когда это закончено, уведомите меня и позвольте мне поднять на этом этапе, "этот момент" является кодом в вашем обратном вызове.Но обратный вызов будет по-прежнему выполняться в том же процессе и том же потоке.
Теперь, node.js также управляет внутренним пулом потоков для ввода-вывода.Это отвлечено от вас: чтобы продолжить аналогию с пекарней, допустим, у вас есть «пул пекарей» - вам, стоя у кассы, вам не нужно знать об этом.Вы просто даете им заказ («одна буханка закваски») и доставляете этот заказ, когда получаете уведомление о его завершении.Но пекари пекут свой хлеб параллельно, в своем собственном «пекарском пуле».