以下代码非常简单,仅用于测试目的,但我没有按照需要获得输出:
from multiprocessing import Process,Lock
def printing(l,i):
l.acquire()
print i
l.release()
if __name__ == '__main__':
lock = Lock()
for i in range(10):
Process(target=printing,args=(lock,i)).start()
输出结果为:
0
1
2
3
5
6
4
7
8
9
锁应该暂停其他进程的执行。为什么不在这里发生?
答案 0 :(得分:3)
您期望得到什么输出?输出看起来很好:range(10)
的排列。进程碰巧执行的顺序可能因运行而异。这是预期的。
我怀疑你误解了锁的作用。当您获得锁定时,其他每个进程也会尝试获取相同的锁定块,直到锁定被释放。这就是全部。在测试运行中,进程0碰巧首先获得锁。在尝试获取锁定的任何其他进程都将被阻止,直到进程0释放锁定。进程0打印0
然后释放锁。然后碰巧过程1获得了锁定。等
注释掉你的l.release()
,你会发现你的程序永远不会完成:第一个获得锁定的进程然后打印出它的整数,所有其他进程永远被阻止等待获取锁。