TL;DR: Я ищу всеобъемлющее или авторитетное объяснение (учебник/книга/презентация/...) asyncio для разработчиков приложений.
В то время как у меня есть достойное понимание циклов событий и фьючерсов/отложенных/ promises (в значительной степени благодаря JavaScript), как-то тонкости асинхронности Python продолжают меня пугать. asyncio кажется значительно более сложным, чем то, к чему я привык - предположительно потому, что он был частично разработан для совместимости с существующими реализациями (Twisted, Tornado и т.д.) на низком уровне и потому, что он допускает несколько циклов событий в отдельных потоках.
Насколько я могу судить, нет всеобъемлющего обзора основных понятий, поэтому я посоветовался с официальными документами а также различные статьи и презентации в Интернете.
Тем не менее я по-прежнему не уверен в своем понимании, вполне возможно, потому что не всегда ясно, что актуально на уровне приложений или вам не нужно беспокоиться об упомянутых выше альтернативах. (Многие ресурсы, похоже, знакомятся с Twisted и др.)
Несколько примеров вещей, которые вызвали неопределенность для меня:
- Пока я использовал
asyncio.coroutine
в сочетании сyield from
, но это сравнение предполагает, что я должен пересмотреть. - Сервер может быть создан с помощью
loop.create_server(MyProtocol)
илиasyncio.start_server(my_connection_handler)
- когда я буду использовать либо? - Что такое правильная гигиена при управлении жизненным циклом петель (например,
loop.close()
послеloop.run_forever()
)? - Мне еще предстоит понять, почему
Task
требуется в дополнение кFuture
s. - Что делать, если я хочу, чтобы конструктор класса был неблокирующим (т.е. используйте
yield from
, который кажется недействительным)? - Может ли get get get быть асинхронным (т.е. комбинировать
@property
иasyncio.coroutine
)? - Как узнать, является ли какая-либо данная функция асинхронной? Например, я ожидаю, что
StreamWriter.write
будет неблокирующим, но я не знаю, действительно ли это дело.
Я не прошу ответа на эти конкретные вопросы, они просто иллюстрируют, как я борюсь на концептуальном уровне.