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 相关文章推荐
压缩包密码破解示例分享(类似典破解)
Jan 17 Python
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
12步入门Python中的decorator装饰器使用方法
Jun 20 Python
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
Python实现中一次读取多个值的方法
Apr 22 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
Pytorch Tensor的统计属性实例讲解
Dec 30 Python
通过实例解析python描述符原理作用
Jan 22 Python
如何基于线程池提升request模块效率
Apr 18 Python
python安装cx_Oracle和wxPython的方法
Sep 14 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获取网页请求状态程序示例
2014/06/17 PHP
兼容ie6浏览器的php下载文件代码分享
2014/07/14 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
php生成word并下载代码实例
2019/03/15 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
2011/04/07 Javascript
子页向父页传值示例
2013/11/27 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
jQuery插件PageSlide实现左右侧栏导航菜单
2015/04/12 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
利用Vue的v-for和v-bind实现列表颜色切换
2020/07/17 Javascript
[03:48]显微镜下的DOTA2第四期——TP动作
2014/06/20 DOTA
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
django 简单实现登录验证给你
2019/11/06 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
Python中生成ndarray实例讲解
2021/02/22 Python
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
2014年五四青年节活动策划书
2014/04/22 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
活动总结报告格式
2014/05/09 职场文书
英语教师自荐信
2014/05/26 职场文书
中标通知书格式
2015/04/17 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
2015年公路路政个人工作总结
2015/07/24 职场文书
python文件与路径操作神器 pathlib
2022/04/01 Python