Python 的多进程编程方法 之 multiprocessing(一)

由于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去掉、改大改小、变换位置来加深对程序运行流程逻辑的印象。


转载于:https://my.oschina.net/CandyMi/blog/638821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值