多个进程之间的多处理同步(Python)

时间:2017-10-29 23:02:40

标签: python synchronization multiprocessing semaphore

所以在大学实习班是一个练习:

  

"创建将共享值定义为0的程序,然后创建和   启动500个流程,每个流程都会增加价值   共享值为1,最后打印共享值。跑   这段代码几次,看看会发生什么,解释...."

最终版本如下:

from multiprocessing import Process, Value


n=Value('i', 0)

def fun():
        n.value+=1

for i in range(500):
        p=Process(target=fun).start()

print n.value

输出值在420-480范围内变化,我理解为什么。
问题是如果可能的话,如何使它总是500? 我一直在阅读Python文档,并找到了可能的解决方案 - 信号量,但也许我对此并不了解。
在Semaphore代码的情况下:

from multiprocessing import Process, Value, Semaphore

n=Value('i', 0)
sem=Semaphore()

def fun():
        sem.acquire()
        n.value+=1
        sem.release()

for i in range(500):
    p=Process(target=fun).start()
print n.value

在这种情况下,最终输出在492-495范围内变化 - 方式更好。

P.S。不建议我使用来自线程类的线程 - 问题是关于多处理。

1 个答案:

答案 0 :(得分:0)

您的流程未加入。因此,您的锁可以工作,但是在完成所有过程之前显示n的值以增加它,因此n <500。 您可以尝试以下代码:

from multiprocessing import Process, Value, Semaphore

n=Value('i', 0)
sem=Semaphore()

def fun():
        sem.acquire()
        n.value+=1
        sem.release()

pcs=[]
for i in range(500):
    p=Process(target=fun)
    pcs.append(p)
    p.start()
for i in pcs:
    i.join()
print n.value