python-多线程编程(五)- 队列的其他方法、线程池

队列

线程的队列使用方法和进程中介绍的大致是相同的,这里再介绍几个队列类

我们使用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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值