第1部分:让我们得到嵌套龙卷风
要找到所需的信息,您必须遵循以下crumbtrails,首先查看的发行说明中描述的内容
IPython 7
它将特别指出有关异步和等待部分的更多信息。
documentation
,到
this discussion
,
建议使用
nest_asyncio
.
关键在于:
-
a)要么欺骗python运行两个嵌套的事件循环。(Nest-Asyncio做什么)
-
b)您在已经存在的EventLoop上调度协程。(我不知道如何处理龙卷风)
我很确定你知道这些,但我相信其他读者会感激的。
不幸的是,除非您像在jupyterhub上那样控制部署,并且可以将这些行添加到自动加载的ipython初创公司脚本中,否则无法使其对用户完全透明。但我认为以下内容足够简单。
import nest_asyncio
nest_asyncio.apply()
# rest of your tornado setup and start code.
第2部分:Gotcha同步代码块EventLoop。
上一节只关注能够运行Tornado应用程序。但请注意
任何同步代码都将阻塞事件循环
;因此在运行时
print(requests.get("http://localhost:8000"))
当您阻止EventLoop时,服务器似乎不工作,只有当等待EventLoop重新启动的代码完成执行时,它才会重新启动…(理解这是留给读者的练习)。你要么发行
print(requests.get(“http://localhost:8000”))
从另一个内核
或者,使用aiohtp。
下面介绍如何以与请求类似的方式使用aiohtp。
import aiohttp
session = aiohttp.ClientSession()
await session.get('http://localhost:8889')
在这种情况下,由于aiohtp是非阻塞的,所以事情看起来会正常工作。在这里,您可以看到一些额外的ipython魔力,我们可以自动检测异步代码并在当前的eventlocop上运行它。
一个很酷的练习可以是
request.get
在另一个内核的循环中,并运行
sleep(5)
在运行Tornado的内核中,看到我们停止处理请求…
第3部分:免责声明和其他途径:
这是
相当棘手
我建议不要在生产中使用,并警告您的用户这不是推荐的操作方法。
这并不能完全解决您的问题,您需要运行一些不在主线程中的东西,我不确定这是否可能。
你也可以试着和其他的循环跑者一起玩
trio
和
curio
;它们可能允许您做默认情况下不能用Asyncio做的事情,比如嵌套,但是
here be dragoons
. 我强烈推荐三重奏和
multiple blog posts around its creation
尤其是当你在教异步的时候。
享受,希望这有帮助,并请报告错误,以及确实有效的事情。