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中的二进制位运算符
May 13 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
Python之读取TXT文件的方法小结
Apr 27 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
基于Python实现签到脚本过程解析
Oct 25 Python
linux环境下安装python虚拟环境及注意事项
Jan 07 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
Feb 12 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
Python rabbitMQ如何实现生产消费者模式
Aug 24 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
python的链表基础知识点
Sep 13 Python
如何在C++中调用Python
May 21 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
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
十大使用PHP框架的理由
2015/09/26 PHP
php for 循环使用的简单实例
2016/06/02 PHP
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
jQuery简单实现遍历单选框的方法
2017/03/06 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
python调用windows api锁定计算机示例
2014/04/17 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
Python操作Excel插入删除行的方法
2018/12/10 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
python 实现波浪滤镜特效
2020/12/02 Python
Python爬虫后获取重定向url的两种方法
2021/01/19 Python
有关打架的检讨书
2014/01/25 职场文书
工程建设实施方案
2014/03/14 职场文书
保险内勤岗位职责
2015/04/13 职场文书
多表查询、事务、DCL
2021/04/05 MySQL