协程
1, 协程: cpu遇到i/o阻塞自动切换执行任务, 为了使得python程序运行效率高 , 更大化的使用cpu, 加入协程, 识别程序的i/o 事件, 自动切换到其他任务去执行
优点1, 开销小, 减少cpu切换时间, 程序自动切换, 操作系统无法感知, 从而不再切换其他线程,
2, 单线程内实现并发 效果, 利用了更多cpu资源
缺点 1, 协程 的本质是单线程, 无法利用多核, 解决方案: 开启多个进程, 每个进程开启多个线程, 单个线程内使用协程
特点: 1, 必须只有一个单线程才能实现并发
2, 修改共享数据不需要加锁, 单线程执行代码是逐行执行的, 全程属于串行
3, 用户程序里自己保持多个控制流的上下文栈
2 . greemlet: 实现了程序代码执行的切换顺序, 并不能检测到 程序的io阻塞事件, 因而不能高效 的利用io时间
def p1(c):
print("a", c )
g2.switch("二货")
print("b", c)
g2.switch()
def p2(d):
pirnt("c", d)
g1.switch()
print("d", d)
g1.switch()
g1=greenlet(p1)
g2=greenlet(p2)
g1.switch("二货")
tip : switch 可以启动执行, 并且里面可以传参, 一次输入, 后续的线程 里面 同一类g1 或者g2 只需要第一次传参即可
3 gevent : 利用了greenlet模块 , 可以感知程序里面的io事件, 实现自动切换 需要加 monkey, monkey.patch_all() 才能识别
gevent.spawn(func, *args, **kwargs) # 创建单线程, 执行函数, 多个 spawn 组成一个单线程 , join()启动执行
g1 = spawn(fun1, 1)
g1.join()
join需要加上, 否则 执行时间过长时, 其他任务结束了 ,他也跟着结束, 导致执行不完整
统一 加join joinall([协程任务 ])
返回值 g1.value()
spawn()执行是异步的, 自动切换顺序
socket # 今天才知道 , listen () 之后, accept可以有多个连接, 利用循环可以多次创建, 保存连接可以触发多对一的服务
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步