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

6

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

例如调用这样一个方法:

from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(1) as executor:
    future = executor.submit(report.write_gresb_workbook)
    print(future.result())

相比之下:

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)

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

该函数仅返回True或False(即my_success),因为报告对象附有输出文件的路径。

我还没有完全搞清楚这两种方法是否正确,但只是在寻找一些背景信息。

谢谢!

1个回答

13

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接