1.线程回调
在线程池/进程池
每次提交任务,都会返回一个表示任务的对象,Future对象
Future对象具备一个绑定方法,add_done_callback 用于指定回调函数
add 意味着可以添加多个回调函数
如果直接使用Thread的话,如何完成回调
from threading importThreadimporttimedefcall_back(res):print('任务结果拿到了:%s' %res)defparser(res):print('任务结果拿到了:%s' %res)deftask(parser):print('run')
time.sleep(1)
res= 100 #表示任务结果
parser(res) #执行回调函数,并传入任务结果
t= Thread(target=task, args=(call_back,)) #在这里指定parser也可以
t.start()print('over')
View Code
2.线程中的队列
from queue importQueue,LifoQueue,PriorityQueue#与进程中的Joinablequeue使用方法一模一样,但是不具备IPC
#Queue 队列#q = Queue()#
## 可以往里面添加数据#q.put('123')#q.put('456')#
## 可以获取数据#print(q.get())#print(q.get())#
## 获取值,设定取值时间,超时报错## print(q.get(block=True,timeout=3))#
## 告诉队列取值已经处理完毕#q.task_done()#q.task_done()## 等待队列为空后结束队列#q.join()#输出结果#123#456
#LifoQueue,翻译为last in first out 后进先出,先进后出,模拟堆栈的模式
#除了与Queue的队列不一样之外,其他的都一样#lq = LifoQueue()#
#lq.put('123')#lq.put('456')#
#print(lq.get())#print(lq.get())#输出结果#456#123
#具备优先级的队列#PriorityQueue#可以存储一个可以比较大小的对象,对象越小,优先级越高,自定义对象不能使用比较运算符,所以不能存储
#q = PriorityQueue()# #q.put('b')#q.put('a')# #print(q.get()) # 会优先得到a
View Code
3.事件 Event()
了解Event之前,我们先了解一个案例: