我尝试使用信号量同步多个进程。我认为不是为每个进程创建一个函数,而是可能以更通用的方式,使用单个函数和依赖项的一些参数:
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
但是同步不能按预期工作。执行是随机的,包括死锁。那是为什么?
答案 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次混合,因为它们被一起踢掉,所以操作符合预期。