IOLoop.current().run_in_executor() 和 ThreadPoolExecutor().submit() 的区别

dyl*_*oll 4 python tornado threadpoolexecutor

我对 Python Tornado 很陌生,一直在尝试启动一个新线程来运行一些 IO 阻塞代码,同时允许服务器继续处理新请求。我一直在做一些阅读,但似乎仍然无法弄清楚这两个功能之间的区别是什么?

例如调用这样的方法:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(1) as executor:
    future = executor.submit(report.write_gresb_workbook)
    print(future.result())
Run Code Online (Sandbox Code Playgroud)

相比:

from concurrent.futures import ThreadPoolExecutor
from tornado import ioloop

with ThreadPoolExecutor(1) as executor:
    my_success = await ioloop.IOLoop.current().run_in_executor(executor, report.write_gresb_workbook)
    print(my_success)
Run Code Online (Sandbox Code Playgroud)

write_gresb_workbook 从对象报告中获取一些信息并将其写入 Excel 电子表格(但是我使用 openpyxl 需要大约 20 秒才能加载适当格式的工作簿,另外大约需要 20 秒才能保存它,这会阻止服务器处理新请求!)

该函数简单地返回 True 或 False(这是什么my_success),因为报告对象具有附加到它的输出文件的路径。

我还没有完全使用这些方法中的任何一种,所以它们可能不正确,但只是在寻找一些背景信息。

干杯!

Ben*_*ell 7

IOLoop.run_in_executorExecutor.submit做本质上相同的事情,但返回不同的类型。IOLoop.run_in_executor返回一个asyncio.Future,而Executor.submit返回一个concurrent.futures.Future

这两种Future类型具有几乎相同的接口,但有一个重要区别:只能在协程中asyncio.Future使用 with await。的目的run_in_executor是提供这种转换。