zoukankan      html  css  js  c++  java
  • python实现线程池


    #
    !/usr/bin/env python # -*- coding:utf-8 -*- import queue import threading import time class WorkManager(object): def __init__(self, work_num=1000,thread_num=10): # work_num是总的任务数,thread_num是每次同时工作的线程数量 self.work_queue = queue.Queue() # 初始化一个线程队列 self.threads = [] # 该列表存放要进行工作的线程类Work的对象,该列表的大小是根据thread_num来指定的 self.__init_work_queue(work_num) # 初始化工作队列,将所有的工作队列放进线程池 self.__init_thread_pool(thread_num) # 初始化线程池,将所有的工作线程放进线程池列表 # self.check_queue() def __init_thread_pool(self,thread_num): # 初始化线程池,将工作线程从队列取出放进线程池列表 for i in range(thread_num): self.threads.append(Work(self.work_queue)) def __init_work_queue(self, work_num): # 初始化工作队列,将所有的工作放进队列 for i in range(work_num): self.add_job(do_job, i) # 将实际的工作函数放进队列 def add_job(self, func, *args): # 添加一个工作入队列,func是实际的工作函数 self.work_queue.put((func, list(args))) # 将实际的工作函数添加入队列,参数args要用列表形式,queue.Queue内部实现了同步机制 def check_queue(self): # 检查剩余队列任务数量 return self.work_queue.qsize() def wait_all_complete(self): # 等待所有线程运行完毕 for item in self.threads: if item.isAlive(): # 判断线程是否是活动状态,如果是则等待线程执行结束 item.join() class Work(threading.Thread): # Work类就是处理单个线程,它负责从队列取出一个线程,并将该线程执行完毕 def __init__(self, work_queue): # 初始化一个工作线程,同时产生工作队列,其中work_queue是WorkManager类中初始化好的一个queue.Queue() threading.Thread.__init__(self) # 自动自行下边的run方法 self.work_queue = work_queue self.start() def run(self): # 重写run方法 # 死循环,从而让创建的线程在一定条件下关闭退出 while True: try: do, args = self.work_queue.get(block=False) # 任务异步出队,Queue内部实现了同步机制 # print('do:',do,'args:',args) do(args) # 从队列里取出线程,并执行,do是函数对象,args是线程号 self.work_queue.task_done() # 通知系统单个任务完成 except Exception as e: break def do_job(args): # 具体要做的任务 time.sleep(2) # 模拟处理时间 print(threading.current_thread(), list(args)) # 打印当前线程对象,和参数列表 if __name__ == '__main__': start = time.time() work_manager = WorkManager(10, 3) # 或者work_manager = WorkManager(10000, 20) work_manager.wait_all_complete() end = time.time() print("cost all time: %s" % (end-start))
  • 相关阅读:
    PAT 1097. Deduplication on a Linked List (链表)
    PAT 1096. Consecutive Factors
    PAT 1095. Cars on Campus
    PAT 1094. The Largest Generation (层级遍历)
    PAT 1093. Count PAT's
    PAT 1092. To Buy or Not to Buy
    PAT 1091. Acute Stroke (bfs)
    CSS:word-wrap/overflow/transition
    node-webkit中的requirejs报错问题:path must be a string error in Require.js
    script加载之defer和async
  • 原文地址:https://www.cnblogs.com/wt11/p/6617598.html
Copyright © 2011-2022 走看看