python 线程队列,线程池
Posted 唯你如我心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 线程队列,线程池相关的知识,希望对你有一定的参考价值。
一. 线程队列
引入线程队列 : 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)#创建回调函数,和进程的创建不同
以上是关于python 线程队列,线程池的主要内容,如果未能解决你的问题,请参考以下文章
python 线程(队列,线程池),协程(理论greenlet,gevent模块,)
python全栈开发 * 线程队列 线程池 协程 * 180731
newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段