【发布时间】:2021-01-17 12:43:49
【问题描述】:
我想在 Python Twisted 中使用一个单独的线程池来完成一些对 CPU 使用率要求很高的特殊工作。
我要执行的函数都定义为inlineCallback,我不能修改。
from twisted.python.threadpool import ThreadPool
@inflineCallbacks
def myFunc(i):
tmp_result = yield intenseCPUwork(i)
# more work ...
return result
pool = ThreadPool(0, 2)
for i in range(100):
pool.callInThread(myFunc, i)
...
但是由于我的函数返回一个 deferred,它们在线程池中像这样调用时会立即返回,从而导致所有 100 个调用一次执行,即使线程池的大小仅为 2。
如何确保在 twisted 中同时只调用两个异步函数?
【问题讨论】:
-
您知道运行 Python 代码的多个线程在单个 CPU 内核上竞争执行吗?
-
是的,我是。 strongCPUWork 函数会打开 deferedToThread 的子进程。它们还可能触发其他计算机上的工作负载。
-
混合多线程和多处理?这是灾难的秘诀。不过,Twisted 有进程管理 API。使用那些而不是线程,你会没事的。
-
我投票结束,因为这个问题实际上没有包含足够的信息来提供一个很好的例子。我建议编辑它以包含所有相关信息,然后也许有人可以提供一个很好的答案!
-
感谢您的 cmets!我将避免灾难并找到一种更自然的方法来处理它,而不是试图将这种方法强制转换为工作版本。