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迭代和迭代器
Mar 28 Python
详解python调度框架APScheduler使用
Mar 28 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
特征脸(Eigenface)理论基础之PCA主成分分析法
Mar 13 Python
对python抓取需要登录网站数据的方法详解
May 21 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
python实现网页录音效果
Oct 26 Python
python打包生成so文件的实现
Oct 30 Python
使用Pytorch训练two-head网络的操作
May 28 Python
python中if和elif的区别介绍
Nov 07 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脚本的10个技巧(6)
2006/10/09 PHP
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
一个PHP分页类的代码
2011/05/18 PHP
PHP IE中下载附件问题解决方法
2014/01/07 PHP
php上传文件常见问题总结
2015/02/03 PHP
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
layui之table checkbox初始化时选中对应选项的方法
2019/09/02 Javascript
vue fetch中的.then()的正确使用方法
2020/04/17 Javascript
jquery自定义组件实例详解
2020/12/31 jQuery
Python3 能振兴 Python的原因分析
2014/11/28 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
机器学习python实战之手写数字识别
2017/11/01 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
python保存字典和读取字典的实例代码
2019/07/07 Python
Win10环境中如何实现python2和python3并存
2020/07/20 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
简述数组与指针的区别
2014/01/02 面试题
一些Solaris面试题
2015/12/22 面试题
英文求职信结束语大全
2013/10/26 职场文书
体育教育专业毕业生自荐信
2013/11/15 职场文书
生产车间班组长岗位职责
2014/01/06 职场文书
学术诚信承诺书
2014/05/26 职场文书
生产操作工岗位职责
2014/09/16 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书