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 相关文章推荐
关于Python面向对象编程的知识点总结
Feb 14 Python
Python进阶-函数默认参数(详解)
May 18 Python
Python网络爬虫神器PyQuery的基本使用教程
Feb 03 Python
Tensorflow的可视化工具Tensorboard的初步使用详解
Feb 11 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
Jul 11 Python
python traceback捕获并打印异常的方法
Aug 31 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
Python通用循环的构造方法实例分析
Dec 19 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
python操作yaml说明
Apr 08 Python
Python与C++中梯度方向直方图的实现
Mar 17 Python
Python&Matlab实现樱花的绘制
Apr 07 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面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
php微信开发之百度天气预报
2016/11/18 PHP
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
js验证是否为数字的总结
2013/04/14 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
jQuery CSS()方法改变现有的CSS样式表
2014/09/09 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
2015/07/05 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
python中urllib模块用法实例详解
2014/11/19 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python import自定义模块方法
2015/02/12 Python
用Python编写一个简单的FUSE文件系统的教程
2015/04/02 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
python如何删除文件中重复的字段
2019/07/16 Python
pytorch 修改预训练model实例
2020/01/18 Python
Python flask框架端口失效解决方案
2020/06/04 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
课外访万家心得体会
2014/09/03 职场文书
流动人口婚育证明
2014/10/19 职场文书
2014会计年终工作总结
2014/12/20 职场文书
聚会通知怎么写
2015/04/23 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书