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

时间:2019-10-16 09:46:53

标签: 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())

相比:

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 个答案:

答案 0 :(得分:1)

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

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