2016-10-20 123 views
4

我想通过将一个信号传递给一个函数来同步对python multiprocessing.Pool中多个工作人员的共享资源的访问。这是一些伪代码。使用python多重处理功能共享一个信号灯

def do_work(payload, semaphore): 
    with semaphore: 
     access_the_shared_resource(payload) 

功能do_work是在库中定义这样的,我不能在我的本地范围,该功能可以继承定义一个信号。我也不能通过functools.partial传递信号量,因为multiprocessing试图腌制不允许的信号量。什么似乎是使用multiprocessing.Manager创建一个代理到Semaphore工作:

manager = multiprocessing.Manager() 
semaphore = manager.Semaphore() 

with multiprocessing.Pool() as pool: 
    results = pool.map(functools.partial(do_work, semaphore=semaphore), payloads) 

这是最好的办法还是我失去了明显的解决方案?

回答

0

你唯一的选择就是使用initializerinitargs到正规multiprocessing.Semaphore通过在创建池时每个工作进程,并把它作为一个全局变量:

semaphore = None 
def do_work(payload): 
    with semaphore: 
     return payload 

def init(sem): 
    global semaphore 
    semaphore = sem 

if __name__ == "__main__": 
    sem = multiprocessing.Semaphore() 
    with multiprocessing.Pool(initializer=init, initargs=(sem,)) as p: 
     results = p.map(do_work, payloads) 

全球semaphore变量定义在父母将在每个子进程中设置为multiprocessing.Semaphore()

使用manager.Semaphore()很好,但它确实需要产生额外的Python进程。