Python多进程机制实例详解


Posted in Python onJuly 02, 2015

本文实例讲述了Python多进程机制。分享给大家供大家参考。具体如下:

在以前只是接触过PYTHON的多线程机制,今天搜了一下多进程,相关文章好像不是特别多。看了几篇,小试了一把。程序如下,主要内容就是通过PRODUCER读一个本地文件,一行一行的放到队列中去。然后会有相应的WORKER从队列中取出这些行。

import multiprocessing
import os
import sys
import Queue
import time
def writeQ(q,obj):
    q.put(obj,True,None)
    print "put size: ",q.qsize()
def readQ(q):
    ret = q.get(True,1)
    print "get size: ",q.qsize()
    return ret
def producer(q):
    time.sleep(5)  #让进行休息几秒 方便ps命令看到相关内容
    pid = os.getpid()
    handle_file = '/home/dwapp/joe.wangh/test/multiprocess/datafile'
    with open(handle_file,'r') as f:   #with...as... 这个用法今天也是第一次看到的
        for line in f:
            print "producer <" ,pid , "> is doing: ",line
            writeQ(q,line.strip())
    q.close()
def worker(q):
    time.sleep(5)  #让进行休息几秒 方便ps命令看到相关内容
    pid = os.getpid()
    empty_count = 0
    while True:
        try:
            task = readQ(q)
            print "worker <" , pid , "> is doing: " ,task
            '''
            如果这里不休眠的话 一般情况下所有行都会被同一个子进程读取到 为了使实验效果更加清楚 在这里让每个进程读取完
一行内容时候休眠5s 这样就可以让其他的进程到队列中进行读取
            '''
            time.sleep(5)  
        except Queue.Empty:
            empty_count += 1
            if empty_count == 3:
                print "queue is empty, quit"
                q.close()
                sys.exit(0)
def main():
    concurrence = 3
    q = multiprocessing.Queue(10)
    funcs = [producer , worker]
    for i in range(concurrence-1):
        funcs.append(worker)
    for item in funcs:
        print str(item)
    nfuncs = range( len(funcs) )
    processes = []    
    for i in nfuncs:
        p = multiprocessing.Process(target=funcs[i] , args=(q,))
        processes.append(p)
    print "concurrence worker is : ",concurrence," working start"
    for i in nfuncs:
        processes[i].start()
    for i in nfuncs:
        processes[i].join()
    print "all DONE"
if __name__ == '__main__':
    main()

实验结果如下:

dwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>python 1.py 
<function producer at 0xb7b9141c>
<function worker at 0xb7b91454>
<function worker at 0xb7b91454>
<function worker at 0xb7b91454>
concurrence worker is : 3 working start
producer < 28320 > is doing: line 1
put size: 1
producer < 28320 > is doing: line 2
put size: 2
producer < 28320 > is doing: line 3
put size: 3
producer < 28320 > is doing: line 4
put size: 3
producer < 28320 > is doing: line 5
get size: 3
put size: 4
worker < 28321 > is doing: line 1
get size: 3
worker < 28322 > is doing: line 2
get size: 2
worker < 28323 > is doing: line 3
get size: 1
worker < 28321 > is doing: line 4
get size: 0
worker < 28322 > is doing: line 5
queue is empty, quit
queue is empty, quit
queue is empty, quit
all DONE

程序运行期间在另外一个窗口进行ps命令 可以观测到一些进程的信息

dwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep python
dwapp  13735 11830 0 Nov20 pts/12  00:00:05 python
dwapp  28319 27481 8 14:04 pts/0  00:00:00 python 1.py
dwapp  28320 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28321 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28322 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28323 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28325 27849 0 14:04 pts/13  00:00:00 grep python
dwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep python
dwapp  13735 11830 0 Nov20 pts/12  00:00:05 python     #此时28320进程 也就是PRODUCER进程已经结束
dwapp  28319 27481 1 14:04 pts/0  00:00:00 python 1.py
dwapp  28321 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28322 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28323 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28328 27849 0 14:04 pts/13  00:00:00 grep python
dwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep python
dwapp  13735 11830 0 Nov20 pts/12  00:00:05 python
dwapp  28319 27481 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28321 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28322 28319 0 14:04 pts/0  00:00:00 python 1.py
dwapp  28323 28319 0 14:04 pts/0  00:00:00 [python] <defunct>  #这里应该是代表28323进程(WORKER)已经运行结束了
dwapp  28331 27849 0 14:04 pts/13  00:00:00 grep python
dwapp@pttest1:/home/dwapp/joe.wangh/test/multiprocess>ps -ef | grep python
dwapp  13735 11830 0 Nov20 pts/12  00:00:05 python
dwapp  28337 27849 0 14:05 pts/13  00:00:00 grep python

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python得到windows自启动列表的方法
Oct 14 Python
Python装饰器基础概念与用法详解
Dec 22 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
Feb 21 Python
详解python运行三种方式
May 13 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
python处理document文档保留原样式
Sep 23 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
Python使用graphviz画流程图过程解析
Mar 31 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
导致python中import错误的原因是什么
Jul 01 Python
python中Array和DataFrame相互转换的实例讲解
Feb 03 Python
Python机器学习之基础概述
May 19 Python
Python回调函数用法实例详解
Jul 02 #Python
在Python中marshal对象序列化的相关知识
Jul 01 #Python
python保存字符串到文件的方法
Jul 01 #Python
python选择排序算法实例总结
Jul 01 #Python
python实现的希尔排序算法实例
Jul 01 #Python
python获取一组汉字拼音首字母的方法
Jul 01 #Python
python的keyword模块用法实例分析
Jun 30 #Python
You might like
《OVERLORD》第四季,终于等到你!
2020/03/02 日漫
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
2019/10/15 PHP
Js+XML 操作
2006/09/20 Javascript
javascript比较文档位置
2008/04/08 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
自定义Django Form中choicefield下拉菜单选取数据库内容实例
2020/03/13 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
周鸿祎:教你写创业计划书
2013/12/30 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
经典英文广告词
2014/03/18 职场文书
525心理活动总结
2014/07/04 职场文书
毕业生应聘求职信
2014/07/10 职场文书
承诺书范本
2015/01/21 职场文书
写给父母的感谢信
2015/01/22 职场文书
财务出纳岗位职责
2015/03/31 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书