19

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

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

据我所知,基本概念没有全面的演练,所以我查阅了官方文档以及网络上的各种文章演示文稿

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

一些给我带来不确定性的例子:

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

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

4

1 回答 1

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

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

于 2015-01-03T17:04:35.103 回答