使用Python的多处理模块进行同步问题

时间:2013-02-27 20:35:17

标签: python synchronization locking multiprocessing

当我从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。为什么?

2 个答案:

答案 0 :(得分:3)

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

锁定获取仅确保他们不会同时尝试print - 但是可以通过任何随机顺序的各种进程获取该锁定。您创建的第一个进程可能会获得更多可能,因为该进程将更快地进行初始化,因此可能是第一个请求锁定的进程。但是没有保证订单。

答案 1 :(得分:1)

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