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中os.path用法分析
Jan 15 Python
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
python中的全局变量用法分析
Jun 09 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Python模拟用户登录验证
Sep 11 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
Python使用指定字符长度切分数据示例
Dec 05 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
使用python求解二次规划的问题
Feb 29 Python
python绘制箱型图
Apr 27 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 Python
python井字棋游戏实现人机对战
Apr 28 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乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
js简易namespace管理器 实例代码
2013/06/21 Javascript
js中parseInt函数浅谈
2013/07/31 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
Angular通过指令动态添加组件问题
2018/07/09 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
详解vue 组件
2020/06/11 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
python机器人行走步数问题的解决
2018/01/29 Python
基于python实现查询ip地址来源
2020/06/02 Python
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
局火灾防控工作方案
2014/05/25 职场文书
文案策划专业自荐信
2014/07/07 职场文书
临床医学专业求职信
2014/08/08 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
教师学习群众路线心得体会
2014/11/04 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers