标签:shutdown ast nbsp 先进先出 current 线程池 int get 组元
一. 线程队列
引入线程队列 : import queue #和普通队列引入方法相同
线程队列方法 :
q = queue.Queue() #实例化对列,先进先出
q = queue.LifoQueue() #实例化队列,后进先出 ( Last in, first out )
q = queue.PriorityQueue() #实例化队列,优先级队列
优先级队列,put() 方法接收的是一个元组,第一个元素是优先级,第二个元素是数据
优先级如果为数字,按照数字大小比较
如果优先级是字符串或特殊字符,按照字符串或特殊字符的ASCII码比较,如果ASCII码相同,按照先进先出原则取出
import queue # q = queue.Queue()#先进先出 # q.put(1) # q.put(2) # q.put(3) # q.put(4) # print(q.get()) # q = queue.LifoQueue()#后进先出 # q.put(1) # q.put(2) # q.put(3) # q.put(4) # print(q.get()) q = queue.PriorityQueue()#优先级队列, q.put((1,‘11‘))#优先级队列添加的参数是一个元组,元组元素为优先 q.put((2,‘22‘)) q.put((3,‘33‘)) q.put((4,‘44‘)) print(q.get())
二. 线程池
import time from concurrent.futures import ThreadPoolExecutor def func(num): time.sleep(0.5) print(num) return num*num #将num*num返回给方法调用者,也就是submit,用t_r接收 t = ThreadPoolExecutor(5) #多线程最大设置数量应该为os.cpu_count()的五倍,尽量不要多 lst = [] for i in range(10): t_r = t.submit(func,i) #提交任务,参数 :第一次参数为要执行的任务,第二个参数为给任务传的参数和进程池不同的是线程池参数传递不需要在写(args= ),直接写参数就好 lst.append(t_r) #将任务返回的结果添加到一个列表中 t.shutdown() #相当于进程的close + join 等待子线程执行完再执行主线程 print(‘主线程‘) [print(i.result()) for i in lst] #对列表进行循环,用result()方法取出,取出的是计算后的结果,并且顺序和for循环相同
################################map方法##############################
import time from concurrent.futures import ThreadPoolExecutor def func(num): time.sleep(0.5) print(num) return num*num
t = ThreadPoolExecutor(5) t.map(func,range(20))#拿不到返回值,拿到的是生成器. 提交多个任务,相当于for+submit() t.shutdown() print(‘主线程‘)
##########################回调函数############################
将普通函数的返回值自动传给回调函数处理
def func(num): time.sleep(0.5) print(num) return num*num def call_back(n): print(‘回调函数 : ‘,n.result()) t = ThreadPoolExecutor(5) lst = [] for i in range(10): t.submit(func,i).add_done_callback(call_back)#创建回调函数,和进程的创建不同
标签:shutdown ast nbsp 先进先出 current 线程池 int get 组元
原文地址:https://www.cnblogs.com/dong-/p/9542347.html