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

问题描述

我想在 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。

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

解决方法

我相信你需要的是对高强度工作的异步/等待功能的支持,就像下面的内容

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,则无法在另一个线程中运行它们。