一 协程
1. 协程:
单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的.
并发真正的核心: 切换并且保持状态.
开启协程并发的执行,自己的程序把控着CPU在多个任务之间来回切换 + 保持状态.
对比操作系统控制线程的切换,用户在单线程内控制协程的切换优缺点:
2. 优点:
1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 2. 单线程内就可以实现并发的效果,最大限度的利用cpu
3. 缺点:
协程的本质是单线程,无法利用多核.
4. 协程的特点:
- 必须在只有一个单线程里实现并发
- 修改共享数据不需要加锁
- 用户程序里自己保存多个控制流的上下文栈
二 greenlet模块
真正的协程模块就是使用greenlet完成的切换
from greenlet import greenlet import time def eat(name): print(f'{name} eat 1') g2.switch('太白') time.sleep(3) print(f'{name} eat 2') g2.switch() def play(name): print(f'{name} play 1') g1.switch() print(f'{name} play 2') g1 = greenlet(eat) g2 = greenlet(play) g1.switch('太白')
三 gevent模块
from gevent import monkey;monkey.patch_all() # 打补丁 必须放在被打补丁者的前面,后面所有的阻塞全都能识别到 import gevent import time def eat(name): print(f'{name} eat 1') time.sleep(2) print(f'{name} eat 2') def play(name): print(f'{name} play 1') time.sleep(1) print(f'{name} play 2') g1 = gevent.spawn(eat,'太白') g2 = gevent.spawn(play,'太白') gevent.joinall([g1,g2])