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开发vim插件及心得分享
Nov 04 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
Nov 07 Python
简单介绍Python中的filter和lambda函数的使用
Apr 07 Python
pandas按若干个列的组合条件筛选数据的方法
Apr 11 Python
Python基于多线程实现抓取数据存入数据库的方法
Jun 22 Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
Aug 12 Python
python模块导入的方法
Oct 24 Python
PYTHON实现SIGN签名的过程解析
Oct 28 Python
Python如何计算语句执行时间
Nov 22 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 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字符串截取问题
2006/11/28 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
jQuery使用unlock.js插件实现滑动解锁
2017/04/04 jQuery
webpack多页面开发实践
2017/12/18 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
axios携带cookie配置详解(axios+koa)
2018/12/28 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
使用Python机器学习降低静态日志噪声
2018/09/29 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Python 3 判断2个字典相同
2019/08/06 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
工业学校毕业生自荐书
2014/01/03 职场文书
副总经理岗位职责
2014/03/16 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android
mysql查看表结构的三种方法总结
2022/07/07 MySQL