【问题标题】:resources for learning/understanding Python's asyncio [closed]用于学习/理解 Python 的 asyncio 的资源 [关闭]
【发布时间】:2015-01-02 12:57:56
【问题描述】:

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

虽然我对事件循环和futures/deferreds/promise 有很好的理解(很大程度上要感谢JavaScript),但不知何故,Python 的asyncio 的复杂性继续让我感到困惑。 asyncio 似乎比我习惯的要复杂得多——大概是因为它的部分设计是为了与现有实现(Twisted、Tornado 等)的低级兼容性,并且因为它允许在单独的线程中进行多个事件循环。

据我所知,没有全面的基本概念演练,所以我在网上查阅了official docs 以及各种articles 和presentations。

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

给我带来不确定性的几个例子:

  • 到目前为止,我只将asyncio.coroutine 与yield from 结合使用,但this comparison 建议我应该重新考虑。
  • 可以使用loop.create_server(MyProtocol) 或asyncio.start_server(my_connection_handler) 创建服务器 - 我什么时候可以使用?
  • 管理循环生命周期的正确卫生是什么(例如loop.close() 在loop.run_forever() 之后)?
  • 我还不明白为什么除了Futures 之外还需要Tasks。
  • 如果我希望类构造函数是非阻塞的(即使用 yield from,这似乎是无效的)怎么办?
  • 类 getter 可以异步(即结合 @property 和 asyncio.coroutine)吗?
  • 我如何知道任何给定的函数是否是异步的?例如,我希望StreamWriter.write 是非阻塞的,但我不知道实际情况是否如此。

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

【问题讨论】:

  • 如果您要书籍或教程,我无能为力。但我可以回答关于 asyncio 的任何特定问题。
  • 谢谢。现在,我不确定将上述问题转化为个人问题是否有意义,因为这无助于我在概念层面的理解。也许我想多了,所以会考虑一下。

标签: python python-asyncio


【解决方案1】:

我和你一样,在寻找答案,但我可以帮你做一件事:

关于非阻塞问题:

我创建了一个程序,它使用异步循环来收听 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

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

【讨论】:

  • 谢谢,了解 Executor 可能会派上用场。但是,“您可以使任何任务不阻塞”假设我已经知道哪些部分正在阻塞 - 但我会怎么做? (请参阅上面的 StreamWriter 示例。)我还找到了您提到的文章 - 希望将来会有更多的报道。
  • 对于streamWriter,它是一个Streaming Object,这意味着它会响应它收到的任何消息,就像一个服务器一样,所以它不会阻塞。它只是在听。至于确定什么是阻塞的,就我而言,我做了一个快速测试并尝试同时运行两个任务并意识到它是阻塞的,然后我明白了。我的任务需要很长时间,所以如果我试图在同一个线程中运行两个,它会阻塞另一个,因此执行程序有自己的线程。我就是这么理解的。但是有很多用例,你是对的,它们没有记录。
  • 即使 Twisted Matrix 不同,它也有助于了解它的工作原理:stackoverflow.com/questions/6117587/…。我也发现了这个:pypi.python.org/pypi/aioprocessing/0.0.1,它试图通过库来解决问题。
  • 我发现 this 很有帮助 - 这是更新和最新的指定 3.5 及更高版本的更改。
猜你喜欢
  • 2011-05-19
  • 2010-11-27
  • 2011-07-02
  • 1970-01-01
  • 2010-12-04
  • 2011-08-19
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多