多处理 - 进程拥有我的计算机

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)

mgi*_*son 8

您的脚本不会接管我的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)

条款,你防止孩子产生孩子的无限循环.

实际上,这在多处理规范中有所记录.