Посмотрел еще на несколько вопросов, но не нашел то, что искал. Я использую Scala, но мои вопросы очень высоки, и, как мы надеемся, агностик любого языка.Как работают обратные вызовы в неблокирующем дизайне?
регулярный сценарий:
Thread A
запускает функцию, и есть некоторые блокировки работы предстоит сделать (скажем, БД вызова).- Функция имеет некоторый неблокирующий код (например,
Async
блок в Scala), чтобы вызвать своего рода «рабочий»Thread B
(в другом пуле), чтобы забрать задачу ввода-вывода. - Метод в
Thread A
завершает возвращение Будущего, которое в конечном итоге будет содержать результат, иThread A
возвращается в свой бассейн, чтобы быстро подобрать другой запрос для обработки.
Q1. Какой-то поток где-то обычно должен ждать?
Мое понимание неблокирующих архитектур заключается в том, что общий подход состоит в том, чтобы по-прежнему иметь некоторое ожидание/блокирование потоков в работе ввода-вывода где-то - это просто случай наличия разных пулов, имеющих доступ к различным ядрам, небольшое количество потоков обработки запросов может управлять большим количеством одновременных запросов, даже не ожидая ядра ЦП.
Это правильное общее понимание?
Q2. Как работает обратный вызов?
В приведенных выше сценариях - Thread B
, что делает работу I/O будет запустить функцию обратного вызова (предоставленный Thread А), если/когда работа ввода/вывода в эксплуатацию - который завершает Future
с каким-то результатом.
Нить А теперь не работает с другим, и больше не связана с первоначальным запросом. Как результат в будущем отправляется обратно в клиентский сокет? Я понимаю, что разные языки имеют разные реализации такого механизма, но на высоком уровне мое текущее предположение заключается в том, что (независимо от языка/структуры) некоторые объекты framework/container всегда должны выполнять какую-то оркестровку, чтобы при выполнении задачи «Будущее» завершен. Результат отправляется обратно в исходный сокет, обрабатывающий запрос.
Я потратил часы, пытаясь найти статьи, которые объяснят это, но каждая статья, похоже, имеет дело с реальными деталями низкого уровня. Я знаю, что я пропустил некоторые детали, но мне сложно задавать свой вопрос, потому что я не совсем уверен, какие части меня не пропали :)
m-z, спасибо за комментарии. Я получаю 1. но все еще не хватает чего-то на 2. У меня есть лучшее понимание Future и ExecutionContext, теперь спасибо. Я думаю, что моя проблема на более высоком уровне, возможно, то есть. как результат успешного завершения объекта Future в куче приводит к выходному потоку? - Я предполагаю, что есть какой-то объект Response, связанный с исходным Будущим, который заставляет выходной поток быть обратно обратно через сокет сервера. Я использую Play/Netty, поэтому, я думаю, мне нужно проверить документы. – JamieP