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 enumerate遍历数组示例应用
Sep 06 Python
Python字符串的encode与decode研究心得乱码问题解决方法
Mar 23 Python
PYTHON基础-时间日期处理小结
May 05 Python
python和shell获取文本内容的方法
Jun 05 Python
浅谈Python 列表字典赋值的陷阱
Jan 20 Python
详解Python 解压缩文件
Apr 09 Python
python opencv实现图像边缘检测
Apr 29 Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 Python
对python中 math模块下 atan 和 atan2的区别详解
Jan 17 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 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格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
动态控制Table的js代码
2007/03/07 Javascript
犀利的js 函数集合
2009/06/11 Javascript
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
javascript 文本框水印/占位符(watermark/placeholder)实现方法
2012/01/15 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
Angular排序实例详解
2017/06/28 Javascript
angular4自定义组件详解
2017/09/28 Javascript
JS中的多态实例详解
2017/10/15 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
Python 错误和异常代码详解
2018/01/29 Python
Python paramiko模块使用解析(实现ssh)
2019/08/30 Python
python sorted函数的小练习及解答
2019/09/18 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
Python装饰器结合递归原理解析
2020/07/02 Python
联想瑞士官方网站:Lenovo Switzerland
2017/11/19 全球购物
值传递还是引用传递
2015/02/08 面试题
实习生体会的自我评价范文
2013/11/28 职场文书
葬礼司仪主持词
2014/03/31 职场文书
政治思想表现评语
2014/05/04 职场文书
出资证明书范本(标准版)
2014/09/24 职场文书
年终工作总结范文
2019/06/20 职场文书
Python加密技术之RSA加密解密的实现
2022/04/08 Python
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang