问题描述
我想在 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)
...
但是由于我的函数返回延迟,因此它们在线程池中调用时会立即返回,从而导致所有 100 个调用都同时执行,即使线程池的大小仅为 2。
解决方法
我相信你需要的是对高强度工作的异步/等待功能的支持,就像下面的内容
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()
,
我要执行的函数都定义为 inlineCallback 并且我不能修改它。
这意味着您不能在非反应器线程中运行它们。除了几个例外(主要与日志记录或线程管理有关)Twisted API 不是线程安全的。您只能在反应器运行的同一线程中使用它们。
如果您无法更改目标函数以停止使用 Twisted API,则无法在另一个线程中运行它们。