Python 这种将线程池与tornado结合使用的方式可以吗?

Python 这种将线程池与tornado结合使用的方式可以吗?,python,multithreading,python-3.x,tornado,python-asyncio,Python,Multithreading,Python 3.x,Tornado,Python Asyncio,所以我在类中创建了一个名为executor的类变量 executor = ThreadPoolExecutor(100) 我不再使用函数和方法,也不再使用装饰器,而是在异步方法中使用下面的行来处理我的阻塞任务(如io和哈希创建等) result = await to_tornado_future(self.executor.submit(blocking_method, param1, param2) 我决定使用这种风格是因为 1-装饰师天生就比较慢 2-不需要额外的方法和函数 3-它按预期

所以我在类中创建了一个名为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\u tornado\u future(executor.submit())也不是免费的。(顺便说一句,我想你想要的是
tornado.gen.convert\u
而不是
tornado.platform.asyncio.to\u tornado\u future
executor.submit
不会返回
asyncio.future


一般来说,在线程池上运行
blocking_method
比直接调用要慢。只有当
blocking\u method
可能会阻塞足够长的时间,以至于您希望主线程可以同时执行其他操作时,才应该这样做

我明白您关于“tornado”future和executor.submit的观点,但如何在异步定义中使用executor.submit并等待表达式得到结果?我想用convert是不可能的,我是不是遗漏了什么?嗯,你说得对<代码>转换生成的在这里不起作用,但
转换为未来的
起作用。也许
concurrent.futures.Future
中的
concurrent.Future
的特殊外壳不值得。你是说直接涉及龙卷风的网络I/O应该发生在
IOLoop
的线程上,还是任何和所有网络I/O(例如使用
bot3
)上?如果是后者,为什么呢?所有使用Tornado的I/O都必须发生在IOLoop的线程上;任何不使用IOLoop的I/O都必须发生在其他线程上。