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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
Python的Django框架中if标签的相关使用
Jul 15 Python
Python实现pdf文档转txt的方法示例
Jan 19 Python
Python装饰器用法实例总结
May 26 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
通过python3实现投票功能代码实例
Sep 26 Python
在python shell中运行python文件的实现
Dec 21 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
Selenium Webdriver元素定位的八种常用方式(小结)
Jan 13 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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
乱谈我对耳机、音箱的感受
2021/03/02 无线电
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
2010/09/01 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
Yii实现简单分页的方法
2016/04/29 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
解决php写入数据库乱码的问题
2019/09/17 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
动态刷新 dorado树的js代码
2009/06/12 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
JS实现六边形3D拖拽翻转效果的方法
2016/09/11 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
vue+elementUi 实现密码显示/隐藏+小图标变化功能
2020/01/18 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
Python实现栈的方法
2015/05/26 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
python添加菜单图文讲解
2019/06/04 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
Python itertools.product方法代码实例
2020/03/27 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
耐克美国官网:Nike.com
2016/08/01 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
危货运输企业安全生产责任书
2014/07/28 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP