python 线程池实现

来源:互联网 发布:linux vim补全插件 编辑:程序博客网 时间:2024/06/06 08:23

python 线程池实现

线程池的目的是减少线程的建立与销毁的时间开销, 使得 100 个任务不需要 100 个线程, 而是用 5 个线程(苦工)来完成. 哪个苦工工作的卖力(快), 就自动多分配任务给它.

# -*- encoding: utf-8 -*-__author__ = 'Mohanson'from queue import Queue, Emptyimport threadingimport tracebackimport sysclass WorkPool(object):    def __init__(self, maxsize=100, thread_num=5):        self.work_queue = Queue(maxsize=maxsize)        self.thread_num = thread_num        self.threads = []        for i in range(self.thread_num):            self.threads.append(WorkThread(self.work_queue))    def addwork(self, func, *args, **kwargs):        self.work_queue.put((func, args, kwargs))    def wait_allcomplete(self):        self.work_queue.join()class WorkThread(threading.Thread):    def __init__(self, work_queue):        threading.Thread.__init__(self)        self.work_queue = work_queue        self.thread_stop = False        self.setDaemon(True)        self.start()    def run(self):        while not self.thread_stop:            try:                do, args, kwargs = self.work_queue.get(block=True)                do(*args, **kwargs)                self.work_queue.task_done()            except Empty:                self.stop()            except Exception:                print(traceback.format_exc(), file=sys.stderr)                self.work_queue.task_done()                continue    def stop(self):        self.thread_stop = True

测试:

import timestart = time.time()def work():    time.sleep(2)    print(3)workpool = WorkPool()for i in range(10):    workpool.addwork(work)workpool.wait_allcomplete()print(time.time() - start)

Github

https://github.com/Mohanson/workpool

0 0
原创粉丝点击