Python实现的自定义多线程多进程类示例


Posted in Python onMarch 23, 2018

本文实例讲述了Python实现的自定义多线程多进程类。分享给大家供大家参考,具体如下:

最近经常使用到对大量文件进行操作的程序以前每次写的时候都要在函数中再写一个多线程多进程的函数,做了些重复的工作遇到新的任务时还要重写,因此将多线程与多进程的一些简单功能写成一个类,方便使用。功能简单只为以后方便使用。

使用中发现bug会再进行更新

#!/usr/bin/env python
  # -*- coding: utf-8 -*-
  # @Time  : 2017/5/10 12:47
  # @Author : zhaowen.zhu
  # @Site  :
  # @File  : MultiThread.py
  # @Software: Python Idle
  import threading,time,sys,multiprocessing
  from multiprocessing import Pool
  class MyTMultithread(threading.Thread):
    '''''
    自定义的线程函数,
    功能:使用多线程运行函数,函数的参数只有一个file,并且未实现结果值的返回
    args:
      filelist  函数的参数为列表格式,
      funname  函数的名字为字符串,函数仅有一个参数为file
      delay   每个线程之间的延迟,
      max_threads 线程的最大值
    '''
    def __init__(self,filelist,delay,funname,max_threads = 50):
      threading.Thread.__init__(self)
      self.funname = funname
      self.filelist = filelist[:]
      self.delay = delay
      self.max_threads = max_threads
    def startrun(self):
      def runs():
        time.sleep(self.delay)
        while True:
          try:
            file = self.filelist.pop()
          except IndexError as e:
            break
          else:
            self.funname(file)
      threads = []
      while threads or self.filelist:
        for thread in threads:
          if not thread.is_alive():
            threads.remove(thread)
        while len(threads) < self.max_threads and self.filelist:
          thread = threading.Thread(target = runs)
          thread.setDaemon(True)
          thread.start()
          threads.append(thread)
  class Mymultiprocessing (MyTMultithread):
  '''''
  多进程运行函数,多进程多线程运行函数
  args:
    filelist  函数的参数为列表格式,
    funname  函数的名字为字符串,函数仅有一个参数为file
    delay   每个线程\进程之间的延迟,
    max_threads 最大的线程数
    max_multiprocess 最大的进程数
  '''
    def __init__(self,filelist,delay,funname,max_multiprocess = 1,max_threads = 1):
      self.funname = funname
      self.filelist = filelist[:]
      self.delay = delay
      self.max_threads = max_threads
      self.max_multiprocess = max_multiprocess
      self.num_cpus = multiprocessing.cpu_count()
    def multiprocessingOnly(self):
      '''''
    只使用多进程
      '''
      num_process = min(self.num_cpus,self.max_multiprocess)
      processes = []
      while processes or self.filelist:
        for p in processes:
          if not p.is_alive():
            # print(p.pid,p.name,len(self.filelist))
            processes.remove(p)
        while len(processes) < num_process and self.filelist:
          try:
            file = self.filelist.pop()
          except IndexError as e:
            break
          else:
            p = multiprocessing.Process(target=self.funname,args=(file,))
            p.start()
            processes.append(p)
    def multiprocessingThreads(self):
      num_process = min(self.num_cpus,self.max_multiprocess)
      p = Pool(num_process)
      DATALISTS = []
      tempmod = len(self.filelist) % (num_process)
      CD = int((len(self.filelist) + 1 + tempmod)/ (num_process))
      for i in range(num_process):
        if i == num_process:
          DATALISTS.append(self.filelist[i*CD:-1])
        DATALISTS.append(self.filelist[(i*CD):((i+1)*CD)])
      try:
        processes = []
        for i in range(num_process):
          #print('wait add process:',i+1,time.clock())
          #print(eval(self.funname),DATALISTS[i])
          MultThread = MyTMultithread(DATALISTS[i],self.delay,self.funname,self.max_threads)
          p = multiprocessing.Process(target=MultThread.startrun())
          #print('pid & name:',p.pid,p.name)
          processes.append(p)
        for p in processes:
          print('wait join ')
          p.start()
        print('waite over')
      except Exception as e:
        print('error :',e)
      print ('end process')
  def func1(file):
    print(file)
  if __name__ == '__main__':
    a = list(range(0,97))
    '''''
    测试使用5线程
    '''
    st = time.clock()
    asc = MyTMultithread(a,0,'func1',5)
    asc.startrun()
    end = time.clock()
    print('*'*50)
    print('多线程使用时间:',end-st)
    #测试使用5个进程
    st = time.clock()
    asd = Mymultiprocessing(a,0,'func1',5)
    asd.multiprocessingOnly()
    end = time.clock()
    print('*'*50)
    print('多进程使用时间:',end-st)
    #测试使用5进程10线程
    st = time.clock()
    multiPT = Mymultiprocessing(a,0,'func1',5,10)
    multiPT.multiprocessingThreads()
    end = time.clock()
    print('*'*50)
    print('多进程多线程使用时间:',end-st)

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

Python 相关文章推荐
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
Nov 28 Python
Python使用百度API上传文件到百度网盘代码分享
Nov 08 Python
Python中用max()方法求最大值的介绍
May 15 Python
Python Socket编程详细介绍
Mar 23 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
Jul 09 Python
OpenCV 边缘检测
Jul 10 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
Python dict和defaultdict使用实例解析
Mar 12 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 Python
python爬取各类文档方法归类汇总
Mar 22 #Python
关于Python正则表达式 findall函数问题详解
Mar 22 #Python
Django自定义过滤器定义与用法示例
Mar 22 #Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
Mar 22 #Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
Mar 22 #Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 #Python
python实现将excel文件转化成CSV格式
Mar 22 #Python
You might like
PHP实现防盗链的方法分析
2017/07/25 PHP
PHP 7安装使用体验之性能大提升,兼容性强,扩展支持不够(升级PHP要谨慎)
2017/07/27 PHP
22点关于jquery性能优化的建议
2014/05/28 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
学习使用jQuery表单验证插件和日历插件
2017/02/13 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
python dict.get()和dict['key']的区别详解
2016/06/30 Python
python实现日常记账本小程序
2018/03/10 Python
Python判断字符串是否为字母或者数字(浮点数)的多种方法
2018/08/03 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
如何在vscode中安装python库的方法步骤
2021/01/06 Python
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
第二课堂活动总结
2014/05/07 职场文书
小学校园之星事迹材料
2014/05/16 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书
联谊活动总结范文
2015/05/09 职场文书
工作年限证明模板
2015/06/15 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
php去除deprecated的实例方法
2021/11/17 PHP
使用python绘制横竖条形图
2022/04/21 Python
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android