由于os模块的fork不能在windwos上运行而选择multiprocessing模块,并且此模块提供更加强大的进程管理、资源共享、分布式机制。
首先我们来一个简单的例子:
# -*- encoding:utf-8-*-
import multiprocessing
def hello():
print "hello world!"
p1 = multiprocessing.Process(target=hello)
p1.start()
结果如下:
/pypy/bin/pypy /pypy/Project/SmallBlog/test.py
hello world!
Process finished with exit code 0
运行流程:
1、引入多进程库
2、进程处理函数
3、实例化进程
4、开始运行进程
现在让我们再进一步理解multiprocessing:
#-*- coding = utf8 -*-
import multiprocessing
import time
def daemon():
name = multiprocessing.current_process().name
print 'Starting:', name
time.sleep(5)
print 'Exiting :', name
def non_daemon():
name = multiprocessing.current_process().name
print 'Starting:', name
print 'Exiting :', name
if __name__ == '__main__':
d = multiprocessing.Process(name='daemon',target=daemon)
d.daemon = True
n = multiprocessing.Process(name='non_daemon',target=non_daemon)
n.daemon = False
d.start()
n.start()
d.join(timeout=1)
print 'd.is_alive()', d.is_alive()
print 'n.is_alive()', n.is_alive()
n.join()
结果如下所示:
/pypy/bin/pypy /pypy/Project/SmallBlog/test.py
Starting: daemon
Starting: non-daemon
Exiting : non-daemon
d.is_alive() True
n.is_alive() False
Process finished with exit code 0
daemon方法:设置调用此方法的进程为守护进程,守护进程将不会有被主进程等待退出的限制
start方法 :运行调用此法的进程;
join方法 :阻塞进程,知道调用join方法的进程执行完毕;(注意:如果join方法内部timeout=x,将会在等待x秒后将不会再等进程了。)
is_alive方法:检查调用此方法的进程是否存活;
运行流程:
1、首先我们将deamon进程设置为守护进程,non_daemon进程为普通进程。
2、开始运行进程并给守护进程加上join方法进行1秒的同步阻塞。
3、1秒的超时时间已过,然后输出我们调用is_alive方法对2个进程进行存活判断的值(bool 类型)。
从以上代码不难看出,主进程退出后daemon进程即使还在运行也与之无关。就是因为这样,我们可以在daemon进程中写一些类似的监控代码来防止主进程异常崩溃并且自动重启的功能。
大家也可以尝试将daemon改成False或者将join方法的timeout去掉、改大改小、变换位置来加深对程序运行流程逻辑的印象。