0

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

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

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

4

2 回答 2

1

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

self._semaphores = [Semaphore(0) for _ in range(size + 1)]
于 2013-05-21T21:54:32.917 回答
0

打印的缩进不正确,这会阻止('Running','1')。搞定后,1打印,然后是2和3混合,然后是4,然后是5。2和3是混合的,因为它们是一起踢的,所以操作符合预期。

于 2016-09-11T19:21:11.087 回答