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中redis的安装和使用
Dec 04 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
python如何定义带参数的装饰器
Mar 20 Python
python try except 捕获所有异常的实例
Oct 18 Python
Django应用程序入口WSGIHandler源码解析
Aug 05 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
Python中logging日志记录到文件及自动分割的操作代码
Aug 05 Python
Python初学者必备的文件读写指南
Jun 23 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 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下几种删除目录的方法总结
2007/08/19 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
js event事件的传递与冒泡处理
2009/12/06 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JavaScript访问字符串中单个字符的两种方法
2015/07/03 Javascript
jquery.cookie.js用法实例详解
2015/12/25 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
基于Bootstrap的Metronic框架实现条码和二维码的生成及打印处理操作
2016/08/29 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
2014年流动人口工作总结
2014/11/26 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android
Python进程间的通信之语法学习
2022/04/11 Python