队列 (同一个进程内的队列 , 多线程)
import queue queue.Queue() 先进先出 queue.lifoQueue() 后进先出 queue.PriorityQueue() 优先级队列
q = queue.PriorityQueue()
q.put() 接收的是一个元组
元组中的第一个参数是 : 表示当前数据的优先级
元组中的第二个参数是 : 需要存放到队列中的数据
优先级的比较(表示优先级的类型必须是一致的)
如果都是int,比数值的大小,优先选出数值较小的
如果都是str ,比较字符串的大小,(从第一个字符串的ASCAII码开始比较)优先选出ASCAII码中靠前的.
线程池
存放固定数量的线程,这些线程等待任务,一旦有任务,就线程自动执行任务.
线程的最佳数量 max_workers = (os.CPU_count() or 1) * 5
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #线程异步和进程异步 #concurrent.futures 这个模块是异步调用机制 #from multiprocessing import Pool 这个模块既可以异步也可以同步, def func (num) : sum = 0 for i in range(num) : sum += i**2 print(sum) if __name__ == '__main__': p = ThreadPoolExecutor(10) for n in range(100): #p.submit(func , args=(n,)) p.submit(func , n)#提交任务 p.shutdown()#等效于进程池中的close+join 是指让父线程等待池中所有进程执行完所有任务
如何把多个任务放入线程池
for + submit 的方式提交多个任务
map(func , iterable)方式去提交多个任务
通过进程池线程池的效率比较
不管是Pool 的进程池还是ProcessPoolExecutor() 的进程池,执行效率相当
ThreadPoolExecutor 的效率要差很多
所以当计算密集时,使用多进程.
线程返回值
用for + submit 方式提交多个任务,用result方法拿结果
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #线程异步和进程异步 #concurrent.futures 这个模块是异步调用机制 #from multiprocessing import Pool 这个模块既可以异步也可以同步, def func (num) : sum = 0 for i in range(num) : sum += i**2 return sum if __name__ == '__main__': p = ThreadPoolExecutor(10) re = [] for n in range(100): #p.submit(func , args=(n,)) r = p.submit(func , n)#提交任务 re.append(r) #p.shutdown()#等效于进程池中的close+join 是指让父线程等待池中所有进程执行完所有任务 [print(i.result()) for i in re ] #在pool 进程中那结果,用get方法 , 在ThreadPoolExecutor中拿结果使用result方法
用map的方式提交多个任务, 返回的是生成器对象,用__next__() 方法拿结果
回调函数
线程池中的回调函数是子线程调用的,和父线程没有关系;
进程池中的回调函数是父进程调用的,和子进程没有关系.
协程