Noe*_*lkd 2 python multiprocessing python-2.7
我只是想了解如何使用multiprocessing.Lock()
从以下示例开始:
http://docs.python.org/2/library/multiprocessing.html
这个例子实际上是:
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()
Run Code Online (Sandbox Code Playgroud)
我有这个作为我的代码:
from multiprocessing import Process, Lock
import datetime
import time
import random
def function(lock, i):
now = datetime.datetime.now()
time.sleep(random.randint(0,3))
lock.acquire()
print "%s says hello, World! at time: %s" % (i,now)
lock.release()
lock = Lock()
for i in range(2):
Process(target=function,args=(lock,i)).start()
Run Code Online (Sandbox Code Playgroud)
在shell中运行它会导致计算机锁定100%cpu,并在cmd中运行数十个python.exe.虽然始终从进程0或一个进程打印消息.看着这个例子,我意识到我错过了:
if __name__ == '__main__':
Run Code Online (Sandbox Code Playgroud)
所以我加上它担心货物代码上帝,并且孤独地看到:
from multiprocessing import Process, Lock
import datetime
import time
import random
def function(lock, i):
now = datetime.datetime.now()
time.sleep(random.randint(0,3))
lock.acquire()
print "%s says hello, World! at time: %s" % (i,now)
lock.release()
if __name__ == "__main__":
lock = Lock()
for i in range(2):
Process(target=function,args=(lock,i)).start()
Run Code Online (Sandbox Code Playgroud)
打印:
1 says hello, World! at time: 2013-05-20 19:40:13.843000
0 says hello, World! at time: 2013-05-20 19:40:13.843000
Run Code Online (Sandbox Code Playgroud)
编辑认为它可能与命名空间有关,所以我试过:
from multiprocessing import Process, Lock
import datetime
import time
import random
def function(l, i):
now = datetime.datetime.now()
time.sleep(random.randint(0,3))
l.acquire()
print "%s says hello, World! at time: %s" % (i,now), i
l.release()
lock = Lock()
for i in range(2):
Process(target=function,args=(lock,i)).start()
Run Code Online (Sandbox Code Playgroud)
仍然是同一个问题
让我困惑的颜色?!任何人都可以对此作出解释吗?
最终编辑:
这就是我现在完成我的小示例代码的方法:
from multiprocessing import Process, Lock
import datetime
import time
import random
print "imports done"
def function(l, i):
now = datetime.datetime.now()
time.sleep(random.randint(0,3))
l.acquire()
print "%s says hello, World! at time: %s" % (i,now)
l.release()
def main():
lock = Lock()
for i in range(2):
Process(target=function,args=(lock,i)).start()
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
imports done
imports done
imports done
1 says hello, World! at time: 2013-05-20 23:26:41.015000
0 says hello, World! at time: 2013-05-20 23:26:41.015000
Run Code Online (Sandbox Code Playgroud)
您的脚本不会接管我的Ubuntu计算机,但它将接管Windows计算机.这是解释:
multiprocessing要求子进程能够import __main__.在*NIX上发生的是子进程的创建,os.fork这意味着它们基本上是从__main__已经导入的父进程克隆的.再次导入它没有坏处.
在Windows上,没有os.fork,所以孩子们实际上需要import __main__再次.但是,当它们出现时import __main__,该脚本中的所有代码都会被执行,这会导致孩子们产生更多的孩子.当你使用
if __name__ == "__main__":
Run Code Online (Sandbox Code Playgroud)
条款,你防止孩子产生孩子的无限循环.