phdru.name / Russian / Software

async.html

Асинхронная обработка ввода/вывода.

Существуют 2 способа обрабатывать большой объём ввода/вывода по многим каналам (например, несколько клиентов, подключённых к серверу) - многопроцессный и асинхронный. Многопроцессные приложения бывают форкающиеся (например, Apache1, SkunkWeb), многопоточные (Zope, вроде бы WebWare), и совмещённые (Apache2 может одновременно и форкаться, и быть многопоточным).

Асинхронные приложения обычно однопроцессные однопоточные, а ввод/вывод они осуществляют асинхронно - работа с каждым сокетом идёт не синхронно (не дожидаясь окончания каждой операции), а маленькими порциями. Основной цикл программы - ожидание выполнения операций в списке сокетов, с небольшим таймаутом. Как только все сокеты отработают, или истечёт таймаут - приложение обслуживает отработавшие сокеты: вызывает callback'и, зарегистрированные для каждого сокета. Callback'и эти обычно вызываются синхронно, то есть программа не работает ни с чем, ждёт завершения выполнения вызванной функции. Для создания асинхронных клиентов и серверов в Питоне есть библиотека asyncore. Она попала в Питон из асинхронного сервера Medusa.

Существуют и комбинированные решения. Для того, чтобы не тратить время на ожидание callback'а, приложение форкается или создаёт поток, в котором и вызывается callback, само же приложение продолжает обслуживать ввод/вывод. Zope - как раз такой комбинированный вариант. Компонент ZServer построен на основе Медузы, в которую добавили многопоточность.


Эта страница https://phdru.name/Russian/Software/async.html была сгенерирована 14.07.2021 в 00:38:05 из шаблона CheetahTemplate async.tmpl; Некоторые права зарезервированы. Вы можете узнать о технических аспектах этого сайта.