# 什么是回调函数:# a交给b一个任务 b在执行完成后回过头调用了a的一个函数 就称之为回调# 为什么需要回调函数:# 需要获取异步任务的结果,但是又不应该阻塞(降低效率)# 高效率的获取任务结果# 通常异步任务都会和回调函数一起使用# 通过给future对象绑定一个函数 add_done_callback()### obj.add_done_callback(参数函数名)# 注意:在多进程中回调函数是交给住进程来执行而在多线程中 回调函数是谁有空谁执行(不是主线程) 队列:
# 队列:# from queue import Queue,LifoQueue,PriorityQueue## # Queue 队列 先进先出# # LifoQueue 堆栈 后进先出# # PriorityQueue 优先级队列 取出顺序是 小的优先级先取出来# # 优先级可以使用数据或者字符# pq =PriorityQueue()# pq.put((1,‘a‘))# pq.put((2,‘b‘))# print(pq.get())
事件: 就是一个通知# 是用于协调多个线程工作的,当一个线程要执行某个操作,需要获取另外一个线程的状态 # from threading import Event,Thread# import time# e = Event() #默认False# def start():# print(‘正在启动服务器‘)# time.sleep(5)# print(‘服务器启动成功‘)# e.set() # 把时间的值设置为Ture# def connect():# print(‘等待服务器启动...‘)# e.wait() #会阻塞 直到对方把事件设置为Ture# if e.isSet():# print(‘连接成功!‘)# Thread(target=start).start()# Thread(target=connect).start()### def connect():# #客户端尝试3次连接服务器 3次不成功后放弃每次等待1s# for i in range(3):# print(‘等待服务器启动...‘)# e.wait(1) #会阻塞 直到对方把事件设置为Ture# if e.isSet():# print(‘连接成功!‘)# break# else:# print(‘连接失败‘)# else:# print(‘服务器没有启动‘)
greenlet 主要封装了生成器 是的我们在使用生成器实现并发时 简化了代码 """ import greenlet import time def task1(): print("task1 run") time.sleep(10) g2.switch() print("task1 run") def task2(): print("task2 run") g1.switch() g1 = greenlet.greenlet(task1) g2 = greenlet.greenlet(task2) g1.switch()
协程:可以这么理解是协助线程更高效的工作本质就是单线程现实并发也称之为微线程(它比线程更轻量级 单线程下任务的切换比操作系统切换线程要简单 的多)
from gevent import monkeymonkey.patch_all()import geventimport time def task3(): print(‘task3 run‘) time.sleep(3) print(‘task3 run‘) def task4(): print(‘task4 run‘) time.sleep(3) print(‘task3 run‘)g1 = gevent.spawn(task3)g2 = gevent.spawn(task4)
异步提交任务 不考虑是否执行完,直接运行下去直接结束 # gevent.joinall([g1,g2]) #等待所有任务结束# 如果开启了一个会产生的io操作 如果没有join 当其他任务结束时这个任务会立即结束不会等待结束,所以要确保给每个任务都添加到join
原文地址:https://www.cnblogs.com/fanbiyong/p/10221212.html
时间: 2024-10-12 19:28:28