如何在协程中使用多个线程池

How to use multiple threadpools in twisted with coroutines

我想在 Python Twisted 中使用一个单独的 threadPool 来完成一些难以 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)

...

但是由于我的函数 return 延迟了它们 return 在线程池中像那样调用时立即执行,导致所有 100 个调用一次执行,即使线程池的大小仅为 2。

如何确保在 twisted 中同时只调用两个异步函数?

我相信你需要的是async/await对紧张工作的功能支持,就像下面这样

import asyncio

async def myFunc(i):
    tmp_result = yield intenseCPUwork(i)
    # more work ...
    return result

loop = asyncio.get_event_loop()
tasks = [
    loop.create_task(myFunc(1)),
    loop.create_task(myFunc(2))
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

The functions I want to execute are all defined as inlineCallback and I can not modify that.

这意味着您不能 运行 在非反应器线程中使用它们。除了几个例外(主要与日志记录或线程管理有关)外,Twisted API 不是线程安全的。您只能在与反应器 运行ning.

相同的线程中使用它们

如果您无法更改目标函数以停止使用 Twisted API,则您无法在另一个线程中 运行 它们。