gpt4 book ai didi

python - 这种将线程池与 Tornado 一起使用的风格可以吗?

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:07 24 4
gpt4 key购买 nike

所以我在我的类中创建了一个名为 executor 的类变量

executor = ThreadPoolExecutor(100)

我没有使用函数和方法并使用装饰器,而是简单地使用以下行来处理我的异步方法中的阻塞任务(如 io 和哈希创建以及......)

result = await to_tornado_future(self.executor.submit(blocking_method, param1, param2)

我决定使用这种风格是因为

1- 装饰器本质上比较慢

2-不需要额外的方法和函数

3- 它按预期工作并且在需要之前没有创建线程

我说得对吗?请使用原因(我想知道我使用的方式是否更慢或使用更多资源或......)

更新

根据 Ben 的回答,我的上述做法是不正确的所以我最终根据需要使用了以下功能,我认为这是最好的方法

def pool(pool_executor, fn, *args, **kwargs):
new_future = Future()
result_future = pool_executor.submit(fn, *args, **kwargs)
result_future.add_done_callback(lambda f: new_future.set_result(f.result()))
return new_future

用法:

result = await pool(self.executor, time.sleep, 3)

最佳答案

只要您所有的阻塞方法都是线程安全的,这就是安全的。既然你提到了在这些线程中执行 IO,我会指出在这里执行文件 IO 没问题,但 Tornado 中的所有网络 IO 都必须发生在 IOLoop 的线程上。

为什么说“装饰器天生就慢”?哪些装饰器比什么慢?一些装饰器根本没有性能开销(尽管大多数确实有一些运行时成本)。 to_tornado_future(executor.submit()) 也不是免费的。 (顺便说一句,我想你想要 tornado.gen.convert_yielded 而不是 tornado.platform.asyncio.to_tornado_futureexecutor.submit 不返回一个 asyncio.Future)。

作为一般规则,在线程池上运行 blocking_method 将比直接调用它。仅当 blocking_method 可能阻塞足够长的时间以至于您希望主线程在此期间有空做其他事情时,才应该这样做。

关于python - 这种将线程池与 Tornado 一起使用的风格可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com