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解析xml模块封装代码
Feb 07 Python
Python程序设计入门(3)数组的使用
Jun 16 Python
python基础教程之面向对象的一些概念
Aug 29 Python
Python函数式编程
Jul 20 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
Jul 02 Python
Python 3.8新特征之asyncio REPL
May 28 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
Jun 24 Python
Python 控制终端输出文字的实例
Jul 12 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
python3+PyQt5+Qt Designer实现界面可视化
Jun 10 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通用防注入程序 推荐
2011/02/26 PHP
PHP实现的DES加密解密实例代码
2016/04/06 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
js实现刷新iframe的方法汇总
2015/04/27 Javascript
jquery实现具有嵌套功能的选项卡
2016/02/12 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
原生javascript中this几种常见用法总结
2020/02/24 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
2020/12/10 Vue.js
python访问抓取网页常用命令总结
2017/04/11 Python
Scrapy的简单使用教程
2017/10/24 Python
python requests 测试代理ip是否生效
2018/07/25 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
J2EE系统只能是基于web
2015/09/08 面试题
授权委托书怎么写
2014/04/03 职场文书
男女朋友协议书
2014/04/23 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
保研专家推荐信范文
2015/03/25 职场文书
python入门之算法学习
2021/04/22 Python
Python函数中apply、map、applymap的区别
2021/11/27 Python