Ресурсы для обучения/понимания Python asyncio
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
будет неблокирующим, но я не знаю, действительно ли это дело.
Я не прошу ответа на эти конкретные вопросы, они просто иллюстрируют, как я борюсь на концептуальном уровне.
Ответы
Ответ 1
Я, как ты, ища ответы, но я могу помочь тебе с одной вещи:
Относительно проблемы без блокировки:
Я создал программу, которая использует асинхронные циклы для прослушивания твиттер-каналов,
я нашел ответ здесь:
выход asyncio из concurrent.futures.Future of Executor
В принципе, используя исполнителя, вы можете сделать любую задачу неблокирующей. Просто предупреждение, мои задачи независимы и не требуют синхронизации, я просто нуждался в них, чтобы они не блокировались. Если вам нужно, чтобы они дождались каждого из них, вы должны использовать семафор
Вот как я это сделал:
@asyncio.coroutine
def boucle_deux():
#faire attendre la boucle si pas bcp de mots
while True:
print("debut du deux")
value = t.next()
future2 = loop.run_in_executor(None, mention, "LQNyL2xvt9OQMvje7jryaHkN8",
"IRJX6S17K44t8oiVGCjrj6XCVKqGSX9ClfpGpfC467rajqePGb",
"2693346740-km3Ufby8r9BbYpyzcqwiHhss22h4YkmnPN4LnLM",
"53R8GAAncFJ1aHA1yJe1OICfjqUbqwcMR38wSqvbzsQMB", 23, value)
response2 = yield from future2
yield from asyncio.sleep(5)
print("fin du deux")
asyncio.Task(boucle_deux())
Вот несколько ссылок, которые я нашел, которые помогли мне лучше понять:
http://www.drdobbs.com/open-source/the-new-asyncio-in-python-34-servers-pro/240168408
http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html
http://www.drdobbs.com/open-source/the-new-asyncio-module-in-python-34-even/240168401
http://ntoll.org/article/asyncio
Конечно, это не книга, но это хорошее начало.