Python自定义进程池实例分析【生产者、消费者模型问题】


Posted in Python onSeptember 19, 2016

本文实例分析了Python自定义进程池。分享给大家供大家参考,具体如下:

代码说明一切:

#encoding=utf-8
#author: walker
#date: 2014-05-21
#function: 自定义进程池遍历目录下文件
from multiprocessing import Process, Queue, Lock
import time, os
#消费者
class Consumer(Process):
  def __init__(self, queue, ioLock):
    super(Consumer, self).__init__()
    self.queue = queue
    self.ioLock = ioLock
  def run(self):
    while True:
      task = self.queue.get()  #队列中无任务时,会阻塞进程
      if isinstance(task, str) and task == 'quit':
        break;
      time.sleep(1)  #假定任务处理需要1秒钟
      self.ioLock.acquire()
      print( str(os.getpid()) + ' ' + task)
      self.ioLock.release()
    self.ioLock.acquire()
    print 'Bye-bye'
    self.ioLock.release()
#生产者
def Producer():
  queue = Queue()  #这个队列是进程/线程安全的
  ioLock = Lock()
  subNum = 4  #子进程数量
  workers = build_worker_pool(queue, ioLock, subNum)
  start_time = time.time()
  for parent, dirnames, filenames in os.walk(r'D:\test'):
    for filename in filenames:
      queue.put(filename)
      ioLock.acquire()
      print('qsize:' + str(queue.qsize()))
      ioLock.release()
      while queue.qsize() > subNum * 10: #控制队列中任务数量
        time.sleep(1)
  for worker in workers:
    queue.put('quit')
  for worker in workers:
    worker.join()
  ioLock.acquire()
  print('Done! Time taken: {}'.format(time.time() - start_time))
  ioLock.release()
#创建进程池
def build_worker_pool(queue, ioLock, size):
  workers = []
  for _ in range(size):
    worker = Consumer(queue, ioLock)
    worker.start()
    workers.append(worker)
  return workers
if __name__ == '__main__':
  Producer()

ps:

self.ioLock.acquire()
...
self.ioLock.release()

可用:

with self.ioLock:
  ...

替代。

再来一个好玩的例子:

#encoding=utf-8
#author: walker
#date: 2016-01-06
#function: 一个多进程的好玩例子
import os, sys, time
from multiprocessing import Pool
cur_dir_fullpath = os.path.dirname(os.path.abspath(__file__))
g_List = ['a']
#修改全局变量g_List
def ModifyDict_1():
  global g_List
  g_List.append('b')
#修改全局变量g_List
def ModifyDict_2():
  global g_List
  g_List.append('c')
#处理一个
def ProcOne(num):
  print('ProcOne ' + str(num) + ', g_List:' + repr(g_List))
#处理所有
def ProcAll():
  pool = Pool(processes = 4)
  for i in range(1, 20):
    #ProcOne(i)
    #pool.apply(ProcOne, (i,))
    pool.apply_async(ProcOne, (i,))
  pool.close()
  pool.join()
ModifyDict_1() #修改全局变量g_List
if __name__ == '__main__':
  ModifyDict_2() #修改全局变量g_List
  print('In main g_List :' + repr(g_List))
  ProcAll()

Windows7 下运行的结果:

λ python3 demo.py
In main g_List :['a', 'b', 'c']
ProcOne 1, g_List:['a', 'b']
ProcOne 2, g_List:['a', 'b']
ProcOne 3, g_List:['a', 'b']
ProcOne 4, g_List:['a', 'b']
ProcOne 5, g_List:['a', 'b']
ProcOne 6, g_List:['a', 'b']
ProcOne 7, g_List:['a', 'b']
ProcOne 8, g_List:['a', 'b']
ProcOne 9, g_List:['a', 'b']
ProcOne 10, g_List:['a', 'b']
ProcOne 11, g_List:['a', 'b']
ProcOne 12, g_List:['a', 'b']
ProcOne 13, g_List:['a', 'b']
ProcOne 14, g_List:['a', 'b']
ProcOne 15, g_List:['a', 'b']
ProcOne 16, g_List:['a', 'b']
ProcOne 17, g_List:['a', 'b']
ProcOne 18, g_List:['a', 'b']
ProcOne 19, g_List:['a', 'b']

Ubuntu 14.04下运行的结果:

In main g_List :['a', 'b', 'c']
ProcOne 1, g_List:['a', 'b', 'c']
ProcOne 2, g_List:['a', 'b', 'c']
ProcOne 3, g_List:['a', 'b', 'c']
ProcOne 5, g_List:['a', 'b', 'c']
ProcOne 4, g_List:['a', 'b', 'c']
ProcOne 8, g_List:['a', 'b', 'c']
ProcOne 9, g_List:['a', 'b', 'c']
ProcOne 7, g_List:['a', 'b', 'c']
ProcOne 11, g_List:['a', 'b', 'c']
ProcOne 6, g_List:['a', 'b', 'c']
ProcOne 12, g_List:['a', 'b', 'c']
ProcOne 13, g_List:['a', 'b', 'c']
ProcOne 10, g_List:['a', 'b', 'c']
ProcOne 14, g_List:['a', 'b', 'c']
ProcOne 15, g_List:['a', 'b', 'c']
ProcOne 16, g_List:['a', 'b', 'c']
ProcOne 17, g_List:['a', 'b', 'c']
ProcOne 18, g_List:['a', 'b', 'c']
ProcOne 19, g_List:['a', 'b', 'c']

可以看见Windows7下第二次修改没有成功,而Ubuntu下修改成功了。据uliweb作者limodou讲,原因是Windows下是充重启实现的子进程;Linux下是fork实现的。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
python基础教程之数字处理(math)模块详解
Mar 25 Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
May 23 Python
python文件的md5加密方法
Apr 06 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
python取余运算符知识点详解
Jun 27 Python
使用Python做垃圾分类的原理及实例代码附源码
Jul 02 Python
Python 列表的清空方式
Jan 13 Python
python实现扫雷游戏
Mar 03 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
Sep 19 #Python
Python操作Access数据库基本步骤分析
Sep 19 #Python
Python自定义主从分布式架构实例分析
Sep 19 #Python
Python实现网络端口转发和重定向的方法
Sep 19 #Python
Python中__init__.py文件的作用详解
Sep 18 #Python
Python简单遍历字典及删除元素的方法
Sep 18 #Python
Python实现压缩与解压gzip大文件的方法
Sep 18 #Python
You might like
php页面缓存ob系列函数介绍
2012/10/18 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
php实现的ping端口函数实例
2014/11/12 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
PHP记录和读取JSON格式日志文件
2016/07/07 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
2012/10/15 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
vue实现点击展开点击收起效果
2018/04/27 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
从Python的源码来解析Python下的freeblock
2015/05/11 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
python requests更换代理适用于IP频率限制的方法
2019/08/21 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
python 实现二维列表转置
2019/12/02 Python
python代码实现TSNE降维数据可视化教程
2020/02/28 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
Python基于Hypothesis测试库生成测试数据
2020/04/29 Python
Python数据可视化常用4大绘图库原理详解
2020/10/23 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
创伤外科专业推荐信范文
2013/11/19 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
新闻学专业职业生涯规划范文:我的人生我做主
2014/09/12 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
Moment的feature导致线上bug解决分析
2022/09/23 Javascript