"""
实现线程的反复调用
用一个线程执行多个任务
"""
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() # 等待任务结束