如何在协程中使用多个线程池
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,则您无法在另一个线程中 运行 它们。
我想在 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,则您无法在另一个线程中 运行 它们。