Преимущество асинхронных библиотек

1

Я прошел через библиотеку twitter finagle, которая представляет собой асинхронную структуру сервиса в scala, и у меня есть некоторые вопросы относительно асинхронных библиотек в целом.

Насколько я понимаю, преимущество синхронной библиотеки, использующей обратный вызов, заключается в том, что поток приложений освобождается, и библиотека вызывает обратный вызов, как только запрос будет завершен по сети. И в общем случае потоки приложений могут не иметь сопоставление 1:1 с потоком библиотеки.

  1. Сервисный вызов в потоке библиотеки блокируется правильно?
  2. Если это случай, то мы просто делаем блокирующий вызов в другом потоке. Это делает поток приложений свободным, но какой-то другой поток выполняет ту же работу. Разве мы не можем просто увеличить количество приложений, чтобы иметь это преимущество?

Возможно, я неправильно понимаю, как асинхронные библиотеки реализованы в Java/Scala или JVM в целом. Может ли кто-нибудь помочь мне понять, как это работает?

Теги:
asynchronous
jvm
finagle

1 ответ

2

Асинхронный подход является полезной абстракцией: ваш интенсивный процессор поток выгружает длительную операцию ввода-вывода в выделенный (возможно, принадлежащий к библиотеке) поток. Когда IO будет завершено, другой поток получит результат ввода-вывода.

Используя блокирующий подход, вы будете пропускать тики ЦП для ваших потоков, которые блокируют вызов IO. И добавив еще несколько потоков, чтобы гарантировать, что всегда есть свободный поток, чтобы сделать некоторые работы по работе с ЦП, теряя ресурсы ОС /JVM для перепланирования.

Блокировка ввода-вывода используется, потому что она проще для программирования (нет необходимости синхронизировать вызывающий и обратный вызов).

На самом деле, IO - это только один возможный случай использования, когда асинхронный стиль полезен. В общем, всякий раз, когда вы чувствуете, что задача под рукой будет выгодна, разбивая ее на несколько действий, которые могут выполняться одновременно и будут взаимодействовать друг с другом, это имеет место для асинхронного стиля. Примеры, не связанные с IO:

  • GUI: поток цикла событий GUI передает пользовательский ввод в фоновый поток, и они выполняют необходимую обработку;
  • Использование современных многоядерных процессоров: если ваша задача может быть разделена на несколько подзадач, вы можете запускать их в отдельных потоках, используя все доступные ядра. Естественно, вам нужно собрать результаты подзадач, и здесь вам понадобится асинхронный стиль.
  • 1
    блокирующий / неблокирующий IO! = асинхронный.
  • 0
    Таким образом, операция ввода-вывода все еще блокирует поток библиотеки, верно?
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню