Я прошел через библиотеку twitter finagle, которая представляет собой асинхронную структуру сервиса в scala, и у меня есть некоторые вопросы относительно асинхронных библиотек в целом.
Насколько я понимаю, преимущество синхронной библиотеки, использующей обратный вызов, заключается в том, что поток приложений освобождается, и библиотека вызывает обратный вызов, как только запрос будет завершен по сети. И в общем случае потоки приложений могут не иметь сопоставление 1:1 с потоком библиотеки.
Возможно, я неправильно понимаю, как асинхронные библиотеки реализованы в Java/Scala или JVM в целом. Может ли кто-нибудь помочь мне понять, как это работает?
Асинхронный подход является полезной абстракцией: ваш интенсивный процессор поток выгружает длительную операцию ввода-вывода в выделенный (возможно, принадлежащий к библиотеке) поток. Когда IO будет завершено, другой поток получит результат ввода-вывода.
Используя блокирующий подход, вы будете пропускать тики ЦП для ваших потоков, которые блокируют вызов IO. И добавив еще несколько потоков, чтобы гарантировать, что всегда есть свободный поток, чтобы сделать некоторые работы по работе с ЦП, теряя ресурсы ОС /JVM для перепланирования.
Блокировка ввода-вывода используется, потому что она проще для программирования (нет необходимости синхронизировать вызывающий и обратный вызов).
На самом деле, IO - это только один возможный случай использования, когда асинхронный стиль полезен. В общем, всякий раз, когда вы чувствуете, что задача под рукой будет выгодна, разбивая ее на несколько действий, которые могут выполняться одновременно и будут взаимодействовать друг с другом, это имеет место для асинхронного стиля. Примеры, не связанные с IO: