Python 从异步函数监视multiprocessing.pool.pool对象

Python 从异步函数监视multiprocessing.pool.pool对象,python,python-asyncio,python-multiprocessing,Python,Python Asyncio,Python Multiprocessing,我有一个由discord bot管理的多处理.pool.pool。由于discord.py是异步的,所以我使用pool.starmap\u async(),pool.apply\u async()和AsyncResult.get()来管理任务。bot在启动时启动一个池(这可能看起来很奇怪,但由于init时间长,这是最有效的方法) 是否有一种方法可以检查在任何给定时刻池中当前排队/执行的进程数量?检查功能可以访问池本身,但不能访问任何异步结果s 我也愿意采用其他方法来获得相同的结果,即池中的活动/

我有一个由discord bot管理的
多处理.pool.pool
。由于discord.py是异步的,所以我使用
pool.starmap\u async()
pool.apply\u async()
AsyncResult.get()
来管理任务。bot在启动时启动一个池(这可能看起来很奇怪,但由于init时间长,这是最有效的方法)

是否有一种方法可以检查在任何给定时刻池中当前排队/执行的进程数量?检查功能可以访问
本身,但不能访问任何
异步结果
s

我也愿意采用其他方法来获得相同的结果,即池中的活动/排队进程

由于discord.py是异步的,所以我使用
pool.starmap\u async()
pool.apply\u async()
AsyncResult.get()
来管理任务

除非采取特殊预防措施,否则这看起来不正确,因为
AsyncResult.get()
将阻止事件循环。类似于
apply\u async
的方法名称中的async不是由asyncio部署的那种async。多处理使用同步代码与子进程通信,在后台线程中这样做可以让代码继续处理其他事情

将asyncio与多处理相结合的一种更安全的方法是模块,该模块提供内部使用多处理的类,其执行器asyncio支持通过

是否有一种方法可以检查在任何给定时刻池中当前排队/执行的进程数量

我认为没有公共API来查询这些信息,但是如果你拥有这个池,你可以很容易地维护必要的统计数据。例如(未经测试):


您可以通过调用
submit()
,来使用它,您可以等待立即获得结果,也可以传递到
create\u task()
以获得一个您可以稍后等待的未来,或者
gather()
以及其他未来,等等。

我很早就意识到了这个结果。get()阻止在asyncio执行器中运行的所有内容。不过,我会试试你的建议。谢谢@melody_florum当然,这也行,你可以调整我的统计类来适应这种方法。直接从asyncio使用
ProcessPoolExecutor
感觉更干净,因为否则您将使用线程执行器来访问进程执行器的结果-延迟更大,复杂性更高,组件之间的某些交互更容易出错。
class Pool:
    def __init__(self, nworkers):
        self._executor = concurrent.futures.ProcessPoolExecutor(nworkers)
        self._nworkers = nworkers
        self._submitted = 0

    async def submit(self, fn, *args):
        self._submitted += 1
        loop = asyncio.get_event_loop()
        fut = loop.run_in_executor(self._executor, fn, *args)
        try:
            return await fut
        finally:
            self._submitted -= 1

    def stats(self):
        queued = max(0, self._submitted - self._nworkers)
        executing = min(self._submitted, self._nworkers)
        return queued, executing