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写的一个squid访问日志分析的小程序
Sep 17 Python
python的re模块应用实例
Sep 26 Python
使用Python的内建模块collections的教程
Apr 28 Python
python脚本作为Windows服务启动代码详解
Feb 11 Python
python如何统计序列中元素
Jul 31 Python
快速解决安装python没有scripts文件夹的问题
Apr 03 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 Python
python梯度下降法的简单示例
Aug 31 Python
Django使用中间件解决前后端同源策略问题
Sep 02 Python
keras绘制acc和loss曲线图实例
Jun 15 Python
Python基于tkinter canvas实现图片裁剪功能
Nov 05 Python
python编程项目中线上问题排查与解决
Nov 01 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之第四天
2006/10/09 PHP
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
php实现的验证码文件类实例
2015/06/18 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
User Scripts: Video Download by User Scripts
2007/05/14 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
JS中完美兼容各大浏览器的scrolltop方法
2015/04/17 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
详解vue的双向绑定原理及实现
2019/05/05 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
对python中的os.getpid()和os.fork()函数详解
2019/08/08 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
详解python中groupby函数通俗易懂
2020/05/14 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
C++面试题目
2013/06/25 面试题
航海技术专业毕业生求职信
2014/04/06 职场文书
统计专业自荐书
2014/07/06 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
800字作文之大雪
2019/12/04 职场文书
警用民用对讲机找不同
2022/02/18 无线电