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生成指定长度的随机数密码
Jan 23 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
python解析xml文件实例分析
May 27 Python
python数字图像处理实现直方图与均衡化
May 04 Python
Python实现获取汉字偏旁部首的方法示例【测试可用】
Dec 18 Python
python实现图像拼接功能
Mar 23 Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
Python3中FuzzyWuzzy库实例用法
Nov 18 Python
python之np.argmax()及对axis=0或者1的理解
Jun 02 Python
python四种出行路线规划的实现
Jun 23 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
smarty缓存用法分析
2014/12/16 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
2016/01/25 PHP
php文件上传的两种实现方法
2016/04/04 PHP
JS Array对象入门分析
2008/10/30 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
Jquery的each里用return true或false代替break或continue
2014/05/21 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
BootStrap Table复选框默认选中功能的实现代码(从数据库获取到对应的状态进行判断是否为选中状态)
2017/07/11 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
详解js中let与var声明变量的区别
2020/04/05 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
日语专业个人的求职信
2013/12/03 职场文书
垃圾桶标语
2014/06/24 职场文书
大学迎新标语
2014/06/26 职场文书
党章培训心得体会
2014/09/04 职场文书
小学新教师个人总结
2015/02/05 职场文书
某某店铺的开业庆典主持词范本
2019/11/25 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书