import queue
import threading
import time
que = queue.Queue()
def do_job():
while True:
#读取队列中的函数内容 赋值给i
i = que.get()
time.sleep(2)
print(f'{i}---{threading.current_thread()}') #处理队列中取出的数据 可以是函数 执行函数并传参就行
que.task_done() #函数退出后告诉队列取出的函数状态
if __name__ == '__main__':
for i in range(3): #启动了三个无限循环取队列的线程 队列为空 程序启动中会阻塞
t=threading.Thread(target=do_job) #启动一个线程
t.daemon = True #设置守护进程 如果主进程退出 线程也会跟着退出
t.start() #启动
time.sleep(1)
for i in range(10):
que.put(i) #向队列中导入数据
que.join() #等待队列中的所有线程执行完毕
https://juejin.cn/post/6844904058533183495
from threading import Thread
import queue
class ThreadManager(Thread): #线程管理器:获取一个队列 根据定义循环get队列参数的方法
def __init__(self,work_quene):
Thread.__init__(self) #继承Thread 初始化Thread 启动一个线程 启动几个 就实例化几个类
self.work_quene = work_quene #获取参数队列
self.daemon = True #设置守护进程 主进程退出 线程退出
def run(self) -> None: #启动run函数重写
while True:
target,args = self.work_quene.get() #从队列中获取参数执行 没有数据会阻塞
target(*args)
self.work_quene.task_done() #执行结束告诉队列减1
class ThreadPoolManager(): #初始化线程池类
def __init__(self,thread_num):
self.quene = queue.Queue() #定义一个队列
self.thread_num = thread_num #定义一个变量 线程池数
self.__init_threading_pool(self.thread_num) #默认启动线程数的线程 循环初始化线程池线程的range参数
def __init_threading_pool(self): #启动的函数
for i in range(self.thread_num):
thread = ThreadManager(self.quene)
thread.start() #调用run函数启动线程
def add_job(self,func,*args):
self.quene.put(func,args) #向队列中添加线程