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删除文件示例分享
Jan 28 Python
Python上下文管理器和with块详解
Sep 09 Python
python读写LMDB文件的方法
Jul 02 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
python实现爬山算法的思路详解
Apr 09 Python
Python制作词云图代码实例
Sep 09 Python
如何定义TensorFlow输入节点
Jan 23 Python
django实现日志按日期分割
May 21 Python
浅谈Python中的模块
Jun 10 Python
python中upper是做什么用的
Jul 20 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
把77A收信机改造成收音机
2021/03/02 无线电
PHP分页效率终结版(推荐)
2013/07/01 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
PHP的serialize序列化数据以及JSON格式化数据分析
2015/10/10 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
js实现弹幕飞机效果
2020/08/27 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
python实现apahce网站日志分析示例
2014/04/02 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
会计专业自我评价
2014/02/12 职场文书
保险专业自荐信范文
2014/02/20 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
教师节班会开场白
2015/06/01 职场文书
高二数学教学反思
2016/02/18 职场文书
《唯一的听众》教学反思
2016/02/18 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL