如何在Python / Tornado中使用run_in_executor方法调用异步函数?

时间:2019-05-03 11:05:40

标签: python multithreading tornado

我有一个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执行异步函数。

2 个答案:

答案 0 :(得分:1)

您不能在ThreadPoolExecutor中运行异步功能(除非您还在那里运行另一个事件循环,通常这不是您想要的)。您可以在主事件循环上安排一个回调,然后在线程上等待它,但这很复杂。通常,当您使用像Tornado这样的异步框架时,您希望尽可能多地停留在事件循环线程上,并且仅在必要时才将其发送到ThreadPoolExecutor(然后将这些函数{{1} },而不是尝试从该线程回调异步代码)。

答案 1 :(得分:0)

我认为

异步处理已随版本6更改。

因此,某些示例/方法可能会产生误导。您可能想要查看龙卷风文档页面以获取最新示例。像here一样向下滚动以获取异步代码示例