首页 > 解决方案 > Python 多处理:将任务异步分配给管理器

问题描述

我需要在不同的进程中保存python对象的实例,调用这些对象的方法并异步收集结果。我的方法是为每个进程和对象创建一个管理器,然后通过管理器调用相应的方法:

from multiprocessing.managers import SyncManager

class RemoteObject():
    
    def __init__(self):
        
        print('Start expensive init')
        ... # do expensive stuff
        print('End expensive init')

    def expensiveJob(self, *args, **kwargs):
        print('Start expensive job')
        ... # do expensive stuff
        print('End expensive job')

class MyManager(SyncManager): pass

managers = []
instances = []

numInstances = 4

# Create the remote objects
for i in range(numInstances):
    manager = MyManager()
    manager.register('RemoteObject', RemoteObject)
    manager.start()
    managers.append(manager)
    instances.append(manager.RemoteObject())

# do the jobs
myResult = [instance.expensiveJob() for instance in instances]

尽管现在每个实例都在不同的进程中,并且作业在这些不同的进程中执行,但对象初始化和昂贵的作业都是一个接一个地发生。也就是说,输出类似于

Start expensive init
End expensive init
Start expensive init
End expensive init
Start expensive init
End expensive init
Start expensive init
End expensive init
Start expensive job
End expensive job
Start expensive job
End expensive job
Start expensive job
End expensive job
Start expensive job
End expensive job

而我想看到类似的东西

Start expensive init
Start expensive init
Start expensive init
Start expensive init
End expensive init
End expensive init
End expensive init
End expensive init
Start expensive job
Start expensive job
Start expensive job
Start expensive job
End expensive job
End expensive job
End expensive job
End expensive job

我怎么能到那里?有没有call_asynchronously我可以使用的方法或类似的东西?(我在多处理模块的文档中没有找到类似的东西。)

请注意,经典进程池在这里不是一个选项,因为我需要在多个昂贵的作业之间保持内存中的远程实例不变。

标签: pythonasynchronousmultiprocessingpython-multiprocessingmultiprocessing-manager

解决方案


推荐阅读