IOLoop.current().run_in_executor() 和 ThreadPoolExecutor().submit() 之间的区别
Difference between IOLoop.current().run_in_executor() and ThreadPoolExecutor().submit()
我是 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 秒来加载保存它,它会阻止服务器处理新请求!)
该函数只是 returns True 或 False(my_success
是什么),因为报告对象附加了输出文件的路径。
我还没有完全掌握这两种方法中的任何一种,因此它们可能不正确,但我只是在寻找一些背景信息。
干杯!
IOLoop.run_in_executor
和 Executor.submit
本质上做同样的事情,但是 return 不同的类型。 IOLoop.run_in_executor
return 是 asyncio.Future
,而 Executor.submit
return 是 concurrent.futures.Future
。
这两个 Future
类型具有几乎相同的接口,有一个重要的区别:在协程中只有 asyncio.Future
可以与 await
一起使用。 run_in_executor
的目的是提供这种转换。
我是 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 秒来加载保存它,它会阻止服务器处理新请求!)
该函数只是 returns True 或 False(my_success
是什么),因为报告对象附加了输出文件的路径。
我还没有完全掌握这两种方法中的任何一种,因此它们可能不正确,但我只是在寻找一些背景信息。
干杯!
IOLoop.run_in_executor
和 Executor.submit
本质上做同样的事情,但是 return 不同的类型。 IOLoop.run_in_executor
return 是 asyncio.Future
,而 Executor.submit
return 是 concurrent.futures.Future
。
这两个 Future
类型具有几乎相同的接口,有一个重要的区别:在协程中只有 asyncio.Future
可以与 await
一起使用。 run_in_executor
的目的是提供这种转换。