多进程之间的多进程同步(Python)
所以在大学实践课上有一个练习: 创建将共享值定义为0的程序,然后创建和 启动500个进程,每个进程都会增加 共享值乘以1,最后打印共享值。跑 这段代码重复了几次,看看会发生什么,解释一下 最终版本如下所示:多进程之间的多进程同步(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
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