Подтвердить что ты не робот

Ресурсы для обучения/понимания 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 будет неблокирующим, но я не знаю, действительно ли это дело.

Я не прошу ответа на эти конкретные вопросы, они просто иллюстрируют, как я борюсь на концептуальном уровне.

4b9b3361

Ответ 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

Конечно, это не книга, но это хорошее начало.