并发编程--进程池与线程池-练习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() # 等待任务结束