# 进程——启动多个进程,进程之间是由操作系统负责调用
# 线程——启动多个线程,真正由CPU执行的最小单位是线程
# 开启一个线程有属于自己的一小块内存
# 关闭一个线程
# 协程——本质上是一个线程
# 能够在多个任务之间切换来节约IO时间,协程中任务切换时间开销远远低于线程进程的切换时间
# 这三者都是实现并发的手段
def consumer(): # 生成器函数
while True:
x = yield
print("处理了数据:",x)
# c = consumer() 调用生成器函数,拿到一个生成器,函数不执行
# next(c) 此刻才开始从生成器函数的第10行开始执行
# c.send(1) 从一个yield开始,到下一个yield停止
def producer():
c = consumer()
next(c)# 激活生成器
for i in range(10):
print("生产了数据:",i)
c.send(i)
producer()
生产了数据: 0
处理了数据: 0
生产了数据: 1
处理了数据: 1
生产了数据: 2
处理了数据: 2
生产了数据: 3
处理了数据: 3
生产了数据: 4
处理了数据: 4
生产了数据: 5
处理了数据: 5
生产了数据: 6
处理了数据: 6
生产了数据: 7
处理了数据: 7
生产了数据: 8
处理了数据: 8
生产了数据: 9
处理了数据: 9
# greenlet模块就是真正的协程 模块
from greenlet import greenlet
def eat():
print("Eating start")
g2.switch() # 多任务之间的切换
print("Eating end")
g2.switch() # 多任务之间的切换
def play():
print("Playing start")
g1.switch() # 多任务之间的切换
print("Playing end")
g1 = greenlet(eat)
g2 = greenlet(play)
g1.switch()
Eating start
Playing start
Eating end
Playing end
# Gevent模块——join,spawn,value三种方法
# g1 = gevent.spawn(func,1,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,后面可以有多个参数,可以是位置实参或关键字实参,都是传递给函数的
# g2 = gevent.spawn(func2)
# g1.join() 等待g1结束
# g2.join() 等待g2结束
# 上述两步合作一步——gevent.joinall([g1,g2])
# g1.value 拿到func1的返回值
# from gevent import monkey;monkey.patch_all()
import time
import gevent
import threading
def