我尝试使用信号量来同步多个进程。我认为不是为每个进程创建一个函数,而是可能以更通用的方式使用单个函数和一些依赖项的参数:
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
但是同步没有按预期工作。执行是随机的,包括死锁。这是为什么?