我有一个python文件,其中有一个包含以下相关代码的龙卷风请求处理程序类:
executor = concurrent.futures.ThreadPoolExecutor(max_workers = 20)
from tornado.platform.asyncio import AnyThreadEventLoopPolicy
asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())
class MainHandler(tornado.web.RequestHandler):
async def connect(self):
# some code
loop = asyncio.get_event_loop()
await loop.run_in_executor(executor, self.connect_function)
async def connect_function(self):
#some code with an await operation somewhere here
所以我的主要目标是能够将请求处理程序与线程一起使用。我发现可以执行此操作的方法是使用方法run_in_executor
。这里的问题是,在connect
方法中,我要等待connect_function
的结尾,该结尾也是异步的,通常会引发错误:RuntimeWarning: coroutine 'MainHandler.connect_function' was never awaited
。
我的问题是,这是否是使线程在龙卷风请求处理程序中工作的唯一方法,如果是,那么是否有方法可以等待方法run_in_executor
执行异步函数。
答案 0 :(得分:1)
您不能在ThreadPoolExecutor中运行异步功能(除非您还在那里运行另一个事件循环,通常这不是您想要的)。您可以在主事件循环上安排一个回调,然后在线程上等待它,但这很复杂。通常,当您使用像Tornado这样的异步框架时,您希望尽可能多地停留在事件循环线程上,并且仅在必要时才将其发送到ThreadPoolExecutor(然后将这些函数{{1} },而不是尝试从该线程回调异步代码)。
答案 1 :(得分:0)
异步处理已随版本6更改。
因此,某些示例/方法可能会产生误导。您可能想要查看龙卷风文档页面以获取最新示例。像here一样向下滚动以获取异步代码示例