TLDR:我正在为应用程序开发人员寻找asyncio的全面或权威解释(教程/书籍/演示文稿/ ...)。
虽然我对事件循环和期货/延迟/承诺有很好的理解(很大程度上要归功于JavaScript),但Python的asyncio的复杂性仍然让我感到困惑。 asyncio似乎比我以前复杂得多 - 大概是因为它部分设计用于与现有实现(Twisted,Tornado等)的低级兼容性,并且因为它允许在单独的线程中进行多个事件循环。 p>
据我所知,基本概念没有全面的演练,所以我已经咨询了official docs以及各种articles和{{3}在网上。
然而,我仍然不确定我的理解,很可能是因为它并不总是清楚应用程序级别的相关内容,或者您是否需要担心上述替代方案。 (许多资源似乎都认为熟悉Twisted等人。)
一些导致我不确定的事情的例子:
asyncio.coroutine
与yield from
结合使用,但presentations表明我应该重新考虑。loop.create_server(MyProtocol)
或asyncio.start_server(my_connection_handler)
创建服务器 - 何时使用?loop.close()
之后的loop.run_forever()
)?Task
之外,我还没理解为什么Future
是必需的。yield from
,这似乎是无效的),该怎么办?@property
和asyncio.coroutine
)?StreamWriter.write
是非阻止的,但我不知道这是否真的如此。我不是要求这些特定问题的答案,它们只是说明了我在概念层面上的挣扎。
答案 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
当然,它不是一本书,但它是一个很好的起点