多进程之间的多进程同步(Python)

多进程之间的多进程同步(Python),python,synchronization,multiprocessing,semaphore,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).st

所以在大学实践课上有一个练习:

创建将共享值定义为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文档,并找到了可能的解决方案——信号量,但可能我没有很好地理解它。。 在信号量代码的情况下:

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范围内变化,这要好得多。


另外,不要建议我使用线程类中的线程-问题是关于多处理。

您的进程没有连接。因此,您的锁可以工作,但n的值在所有进程递增之前显示,因此,您的代码就像第一个版本一样工作,如果我在循环外定义锁,在定义函数之前,它就像信号灯一样工作,因为信号灯是一个修改过的锁嘿,我的坏,问题似乎实际上是进程没有被加入,请检查编辑的代码,我运行了它,它似乎工作正常。你设置的信号灯工作得很好。在你编辑的代码中对我来说没有意义。。我想要的是并行执行所有进程,如果我在每个进程启动后加入它,它就像正常的循环“对于范围500中的i”,每个进程都不会在前一个进程未结束之前启动,并且不需要任何信号量或锁。例如,如果你把time.sleep1放入函数中,你需要等待500秒,直到它结束。是的,对不起,我的缩进搞错了。基本上,将连接置于循环之外。现在,所有进程都已启动,并在打印值之前连接。最初的问题是,它不是等待每个进程都完成才能打印输出,而是等待它启动。在打印输出之前,最后几个过程不会完成。添加p.join允许在打印之前等待所有进程完成。顺便说一句,明天将尝试!
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