python在windows上使用多进程的坑

2018-06-25  本文已影响135人  赵智雄

一,python的main函数。

一般的语言都是从main函数开始的。python有点不同,Python使用缩进对齐组织代码的执行,所有没有缩进的代码(非函数定义和类定义),都会在载入时自动执行,这些代码,可以认为是Python的main函数。

python的主函数一般都写成if __name__ == "__main__":
当这个模块是主调用的和被调用的时候,__name__的值是不一样的,当这个模块是主调用模块的时候,__name__的值是"__main__",当这个模块被调用的时候,__name__的值是这个模块的名字。因此if __name__ == "__main__":这句话就可以起到主函数的作用。只有它是主调模块的时候才执行,被别的模块import的时候,就不会执行了。

# -*-coding:utf-8-*-

print "a.py..."
print "__name__: " + __name__

if __name__ == '__main__':
     print "__name__: " + __name__

a.py

# -*-coding:utf-8-*-
import a as aa
print "b.py..."
print "__name__: " + __name__
if __name__ == '__main__':
    print "a.__name__: " + aa.__name__

b.py

二, 多进程。

多进程用的是multiprocessing,在windows上和linux上,实现方式不太一样。在windows上会有一个import创建进程的模块的操作,而linux上就没有。所以创建进程的操作要用if __name__ == "__main__":保护起来,否则就会递归创建进程,或者出其它什么错误。
下面的代码在linux和windows上运行的结果就不一样。就是很简单地创建了8个进程。

# -*-coding:utf-8-*-

from multiprocessing import Process as process
from urllib import urlretrieve
import os

def task(i):
    print 'task '+ str(i)


def make_process():
    pn = []
    for i in range(8):
        p = process(target=task, args=(i, ))
        pn.append(p)
        p.start()
        p.join()
print "make_process..."
print '__name__ :  ' + __name__


if __name__ != '__main__':
    print "我被import了。。。"

make_process()
# if __name__ == '__main__':
#     make_process()

在linux上就不会有问题,在windows上就会递归创建进程。


linux运行结果
上一篇下一篇

猜你喜欢

热点阅读