2013-02-27 125 views
2

当我从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 

需要注意的是4前打印3和6印在5之前。为什么?

+4

一行10人在一个房间里,然后当你大喊“走”时,他们都必须穿过和走出单门。他们以什么顺序离开? – 2013-02-27 20:41:24

+0

如果您希望进程顺序运行,请勿使用'multiprocessing'。您可以使用正确的同步原语强制进行顺序计算,但是为什么?只需在一个过程中一个接一个地运行它们。另一方面,如果你只是想按顺序获得_results_,那就很有道理,并且有办法做到这一点(如果你可以使用一个池而不是一个单独的进程,每个任务都是微不足道的;不平凡但仍然非常简单如果你不能)。 – abarnert 2013-02-27 20:59:12

回答

3

因为multiprocessing的整点是并行。您的流程正在彼此同时运行,因此它们可能会以任何顺序开始和结束。

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

+0

感谢Amber,但是他们的意思是“不使用来自不同进程的锁输出可能会让所有混淆。”在他们的页面? – polerto 2013-02-27 20:41:56

+2

@polerto不要在你的'f'函数中放置1个'print'语句,试着放3个。你会注意到没有锁定,有时单个数字会混淆起来(例如'1,1,2,1,2 ,2'),而对于锁,数字的顺序可能会混在一起,但是相同的数字总会在一起(例如'2,2,2,1,1,1')。 – Amber 2013-02-27 20:43:25

1

这取决于操作系统如何计划首先运行哪一个,并且锁只能防止它们中的多个运行在同一时间。