如何解决如何在与协程扭曲中使用多个线程池
我想在 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,则无法在另一个线程中运行它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。