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 字符串格式化代码
Mar 17 Python
Python自动登录126邮箱的方法
Jul 10 Python
简介Django中内置的一些中间件
Jul 24 Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
机器学习python实战之决策树
Nov 01 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
Python堆排序原理与实现方法详解
May 11 Python
pandas 转换成行列表进行读取与Nan处理的方法
Oct 30 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
Python配置文件处理的方法教程
Aug 29 Python
Python 求数组局部最大值的实例
Nov 26 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
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
PHP之正则表达式捕获组与非捕获组(详解)
2015/07/29 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
PHP分享图片的生成方法
2018/04/25 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
复制本贴标题和地址的js代码
2008/07/01 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
利用onresize使得div可以随着屏幕大小而自适应的代码
2010/01/15 Javascript
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
JQuery DataTable删除行后的页面更新利用Ajax解决
2013/05/17 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
JavaScript使用Prototype实现面向对象的方法
2015/04/14 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
jquery+php后台实现省市区联动功能示例
2019/05/23 jQuery
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
JavaScript 声明私有变量的两种方式
2021/02/05 Javascript
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
员工拾金不昧表扬信
2014/01/09 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
党员志愿者活动方案
2014/08/28 职场文书
志愿者事迹材料
2014/12/26 职场文书
幼儿园中秋节活动总结
2015/03/23 职场文书
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python