Python中的进程同步

时间:2013-05-21 21:48:37

标签: python multiprocessing semaphore synchronisation

我尝试使用信号量同步多个进程。我认为不是为每个进程创建一个函数,而是可能以更通用的方式,使用单个函数和依赖项的一些参数:

import multiprocessing
from multiprocessing import *

class Worker:
    def __init__(self, size):
        self._semaphores = [Semaphore(0)]*(size + 1)

    def run(self, name, acquire, release):
        for i in acquire:
            self._semaphores[i].acquire()

            print('Running', name)

        for i in release:
            self._semaphores[i].release()

在这种情况下,我有五个进程。第一个是第一个,第二个和第三个是在第一个之后,第四个是在第二个和第三个之后,第五个是第四个之后。

if __name__ == '__main__':
    worker = Worker(5)
    Process(target=worker.run, args=('5', [5], [])).start()
    Process(target=worker.run, args=('4', [4,4], [5])).start()
    Process(target=worker.run, args=('3', [3], [4])).start()
    Process(target=worker.run, args=('2', [2], [4])).start()
    Process(target=worker.run, args=('1', [], [2,3])).start()

预期输出为:

Running 1
Running 2
Running 3
Running 4
Running 5

但是同步不能按预期工作。执行是随机的,包括死锁。那是为什么?

2 个答案:

答案 0 :(得分:1)

[Semaphore(0)]*(size + 1)创建一个列表,其中包含对{em>单个 size + 1对象的Semaphore个引用。您需要创建该类的不同实例:

self._semaphores = [Semaphore(0) for _ in range(size + 1)]

答案 1 :(得分:0)

打印件的缩进不正确,导致(' Running',' 1')。修好之后,打印1次,然后混合2次和3次,然后是4次,然后是5次,然后是5次混合,因为它们被一起踢掉,所以操作符合预期。