当我从Python的多处理模块page运行以下代码时:
from multiprocessing import Process, Lock
def f(l, i):
l.acquire()
print 'hello world', i
l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(10):
Process(target=f, args=(lock, num)).start()
有时我得到无序输出,例如:
hello world 0
hello world 1
hello world 2
hello world 4
hello world 3
hello world 6
hello world 5
hello world 7
hello world 8
hello world 9
请注意,在3之前打印4,在5之前打印6。为什么?
答案 0 :(得分:3)
因为multiprocessing
的重点是并行。您的流程彼此同时运行,因此它们实际上可以按任何顺序开始和结束。
锁定获取仅确保他们不会同时尝试print
- 但是可以通过任何随机顺序的各种进程获取该锁定。您创建的第一个进程可能会获得更多可能,因为该进程将更快地进行初始化,因此可能是第一个请求锁定的进程。但是没有保证订单。
答案 1 :(得分:1)
这取决于操作系统如何安排首先运行的操作系统,而您的锁只能防止其中多个操作系统同时运行。