用于学习/理解Python的asyncio的资源

时间:2015-01-02 12:57:57

标签: python python-asyncio

TLDR:我正在为应用程序开发人员寻找asyncio的全面或权威解释(教程/书籍/演示文稿/ ...)。

虽然我对事件循环和期货/延迟/承诺有很好的理解(很大程度上要归功于JavaScript),但Python的asyncio的复杂性仍然让我感到困惑。 asyncio似乎比我以前复杂得多 - 大概是因为它部分设计用于与现有实现(Twisted,Tornado等)的低级兼容性,并且因为它允许在单独的线程中进行多个事件循环。 p>

据我所知,基本概念没有全面的演练,所以我已经咨询了official docs以及各种articles和{{3}在网上。

然而,我仍然不确定我的理解,很可能是因为它并不总是清楚应用程序级别的相关内容,或者您​​是否需要担心上述替代方案。 (许多资源似乎都认为熟悉Twisted等人。)

一些导致我不确定的事情的例子:

  • 到目前为止,我只将asyncio.coroutineyield from结合使用,但presentations表明我应该重新考虑。
  • 可以使用loop.create_server(MyProtocol)asyncio.start_server(my_connection_handler)创建服务器 - 何时使用?
  • 管理循环的适当卫生是什么?生命周期(例如loop.close()之后的loop.run_forever())?
  • 除了Task之外,我还没理解为什么Future是必需的。
  • 如果我希望类构造函数是非阻塞的(即使用yield from,这似乎是无效的),该怎么办?
  • 类getter可以异步(即组合@propertyasyncio.coroutine)?
  • 我如何知道任何给定的函数是否是异步的?例如,我希望StreamWriter.write是非阻止的,但我不知道这是否真的如此。

我不是要求这些特定问题的答案,它们只是说明了我在概念层面上的挣扎。

1 个答案:

答案 0 :(得分:3)

我喜欢你,寻找答案,但我可以帮助你:

关于非阻塞问题:

我创建了一个使用异步循环来收听Twitter提要的程序,

我在这里找到了答案: asyncio yield from concurrent.futures.Future of an Executor

基本上,使用执行程序,您可以使任何任务无阻塞。只是一个警告,我的任务是独立的,不需要同步,我只需要它们成为非阻塞。如果你需要他们等待每个toher,你必须使用信号量

这是我怎么做的:

@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

当然,它不是一本书,但它是一个很好的起点