# 什么是回调函数:
# 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 monkey
monkey.patch_all()
import gevent
import 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