2

当我从 Python 的多处理模块页面运行以下代码时:

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

请注意,4 在 3 之前打印,6 在 5 之前打印。为什么?

4

2 回答 2

3

因为整点multiprocessing并行性。您的进程彼此同时运行,因此它们实际上可能以任何顺序开始和结束。

锁定获取仅确保它们不会同时尝试print -但该锁定可能由各种进程以任何随机顺序获取。它更有可能被您创建的第一个进程获取,因为该进程将更快地完成初始化,因此很可能是第一个请求锁的进程。但是不能保证顺序。

于 2013-02-27T20:38:27.600 回答
1

这取决于操作系统如何安排哪个先运行,而您的锁只能防止其中一个以上同时运行。

于 2013-02-27T20:40:34.670 回答