并发编程--进程池与线程池-练习2

通过继承threading类,实现一个线程池

实现代码:

# coding = utf-8
'''
自己实现一个线程池
'''
import time
import queue
import threading

class MyThreadPool(object):
    def __init__(self, num):
        super().__init__()
        # self.daemon = True  # 设置为守护线程
        self.queue = queue.Queue()  # 队列

        # 给定线程池大小,并启动线程
        for i in range(1, num+1):
            thread = threading.Thread(target=self.processing, name='thread_{}'.format(i), daemon=True)
            thread.start()

    def apply_async(self, func, args=(), kwargs={}):
        '''
        接收待处理任务函数及其参数,并将参数与函数保存到队列中,方便线程池处理
        :param args:
        :param kwargs:
        :return:
        '''
        self.queue.put((func, args, kwargs))

    def processing(self):
        '''
        处理任务, 通过while循环,从队列中取出处理任务的函数及其对象参数,并调用
        :return:
        '''
        while True:
            try:
                func, args, kwargs = self.queue.get()
                func(*args, **kwargs)
            finally:
                # 标识此次处理任务结束
                self.queue.task_done()

    def join(self):
        '''
        从task_done中确定队列是否为空,保证队列中的任务都已经完成
        :return:
        '''
        self.queue.join()

def func1():
    time.sleep(3)
    print('111')

def func2():
    time.sleep(3)
    print("222")

def func3():
    time.sleep(3)
    print('333')

if __name__ == '__main__':
    # 实例化一个线程池
    threads = MyThreadPool(2)
    # 任务处理
    threads.apply_async(func1, args=(), kwargs={})
    threads.apply_async(func2, args=(), kwargs={})
    threads.apply_async(func3, args=(), kwargs={})
    # 线程池结束
    threads.join()
    print('任务结束')

 

posted @ 2018-05-07 10:12  温良Miner  阅读(126)  评论(0编辑  收藏  举报
分享到: