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中正则表达式的使用详解
Oct 17 Python
Python脚本实现集群检测和管理功能
Mar 06 Python
浅谈Python在pycharm中的调试(debug)
Nov 29 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
python networkx 根据图的权重画图实现
Jul 10 Python
python 随机森林算法及其优化详解
Jul 11 Python
Python3并发写文件与Python对比
Nov 20 Python
python内置模块collections知识点总结
Dec 19 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
python Paramiko使用示例
Sep 21 Python
python中_del_还原数据的方法
Dec 09 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
php5.3 注意事项说明
2013/07/01 PHP
linux中cd命令使用详解
2015/01/08 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
Asp.net下利用Jquery Ajax实现用户注册检测(验证用户名是否存)
2010/09/12 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
2012/08/09 Javascript
javascript实现tabs选项卡切换效果(自写原生js)
2013/03/19 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python素数检测实例分析
2015/06/15 Python
Python中xrange与yield的用法实例分析
2017/12/26 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
德国孕妇装和婴童服装网上商店:bellybutton
2018/04/12 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
五型班组建设方案
2014/02/10 职场文书
团日活动总结书
2014/05/08 职场文书
优秀班主任先进事迹材料
2014/12/16 职场文书
2014年标准化工作总结
2014/12/17 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
外出培训学习心得体会
2016/01/18 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
python使用glob检索文件的操作
2021/05/20 Python
浅谈MySQL user权限表
2021/06/18 MySQL
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫