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获取CPU、内存和硬盘等windowns系统信息的2个例子
Apr 15 Python
python应用程序在windows下不出现cmd窗口的办法
May 29 Python
Python3基础之list列表实例解析
Aug 13 Python
Python判断变量是否已经定义的方法
Aug 18 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
Python3按一定数据位数格式处理bin文件的方法
Jan 24 Python
Python如何使用OS模块调用cmd
Feb 27 Python
python 基于wx实现音乐播放
Nov 24 Python
Python读写yaml文件
Mar 20 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
javascript,php获取函数参数对象的代码
2011/02/03 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP设计模式之建造者模式定义与用法简单示例
2018/08/13 PHP
Laravel框架Auth用户认证操作实例分析
2019/09/29 PHP
日期函数扩展类Ver0.1.1
2006/09/07 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
AngularJS快速入门
2015/04/02 Javascript
基于Javascript实现返回顶部按钮
2016/02/29 Javascript
Sea.JS知识总结
2016/05/05 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
python实现多线程行情抓取工具的方法
2018/02/28 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
python一行sql太长折成多行并且有多个参数的方法
2018/07/19 Python
Python中正则表达式的用法总结
2019/02/22 Python
Python字符串对象实现原理详解
2019/07/01 Python
python获取指定日期范围内的每一天,每个月,每季度的方法
2019/08/08 Python
Python调用飞书发送消息的示例
2020/11/10 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
铲车司机岗位职责
2014/03/15 职场文书
合作协议书范本
2014/10/25 职场文书
小学教育见习报告
2014/10/31 职场文书