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

"""
实现线程的反复调用
用一个线程执行多个任务
"""
import threading
import queue

class MyThread(threading.Thread):
    """
    通过一些方法实现线程的反复调用
    """

    def __init__(self):
        super().__init__()
        self.queue = queue.Queue()  # 实例化队列
        self.daemon = True  # # 设置为守护线程,随着主线程结束而结束
        self.start()  # 开启线程,让线程在实例时就开启

    def run(self):
        """
        通过while True实现反复调用的过程
        让线程去调用
        :return:
        """
        while True:
            # 从对列中取出处理任务的函数及参数,然后调用处理逻辑
            func, args, kwargs = self.queue.get()
            # 任务处理
            func(*args, **kwargs)

            # 标识本次任务处理完毕,并通知queue.join
            self.queue.task_done()  # 队列内部的计数器,每次执行任务,调用一次

    def apply_async(self, func, args=(), kwargs={}):
        """
        接受待处理任务的函数及其参数,并传入到队列中
        :param func: 待处理任务
        :return:
        """
        # 将待处理任务的函数及其参数存入到队列中
        self.queue.put((func, args, kwargs))

    def join(self, timeout=None):
        """
        等待队列中的任务处理完毕
        :param timeout:
        :return:
        """
        # 从task_done()中获取任务是否处理完毕
        self.queue.join()

def func1():
    """
    待处理逻辑,需要线程去完成的任务
    :return:
    """
    print('Thread to do sth_1... ')
def func2():
    """
    待处理逻辑,需要线程去完成的任务
    :return:
    """
    print('Thread to do sth_2... ')
def func3():
    """
    待处理逻辑,需要线程去完成的任务
    :return:
    """
    print('Thread to do sth_3... ')


if __name__ == '__main__':
    t = MyThread()  # 实例一个线程

    # 让线程t完成func1,func2,func3三个任务
    t.apply_async(func1)
    t.apply_async(func2)
    t.apply_async(func2)

    t.join()  # 等待任务结束

 

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