队列
线程的队列使用方法和进程中介绍的大致是相同的,这里再介绍几个队列类
我们使用queue模块
import queue
栈
LifoQueue类会生成一个栈类型的队列,其中的数据是先进后出的
import queue
q = queue.LifoQueue()
for i in range(10):
q.put(i)
print(q.get())
-------------------
9
优先级队列
PriorityQueue,可以为存入队列数据指定优先级。
优先级高的数据将会被优先取出,优先级数值越小,优先级越高。
在相同优先级的情况下,则以数值的asci码越小优先级越高
import queue
q = queue.PriorityQueue()
q.put([40, 'a'])
q.put([30, 'b'])
q.put([10, 'd'])
print(q.get())
------------------
[10, 'd']
线程池
使用线程池,我们引入一个新的模块concurrent.futures
- ThreadPoolExecutor:线程池
- ProcessPoolExecutor :进程池
这个模块可以同时使用线程池的类和进程池的类,非常方便
基本方法
import concurrent.futures
- submit:异步提交任务
- map:取代for循环submit的操作,使用map无法获得线程函数的返回值
- shutdowm:相当于进程池pool.close() + pool.join()
- result:取得结果
- add_done_callback:回调函数
简单例子
线程池的最大数量,我们一般取cpu个数的5倍
from concurrent.futures import ThreadPoolExecutor
from time import sleep
def fun1(n):
sleep(1)
print(n)
tpool = ThreadPoolExecutor(max_workers=10)
for i in range(10):
tpool.submit(fun1,i)
tpool.shutdown() #当所有子线程执行完毕之后,代码再向下运行
print("主线程")
-------------------------
0
3
1
5
7
9
2
6
8
4
主线程
回调函数
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
from time import sleep
def fun1(n):
print(n)
return n
def callbak(m):
print("我是回调函数%d"%m.result()) #传入的是一个回调对象,需要用result方法拿到返回值
tpool = ThreadPoolExecutor(max_workers=10)
for i in range(5):
tpool.submit(fun1,i).add_done_callback(callbak)