同步: 指代码调用IO操作时,必须等待IO操作完成才返回的调用方式
异步: 指代码调用IO操作时,不必等IO操作完成就返回的调用方式
阻塞: 从调用者的角度出发,如果在调用的时候,被卡住,不能再继续向下运行,需要等待,就说是阻塞
非阻塞: 从调用者的角度出发, 如果在调用的时候,没有被卡住,能够继续向下运行,无需等待,就说是非阻塞
定义: send方法有一个参数,该参数指定的是上一次被挂起的yield语句的返回值
import time
def task1():
while True:
print("--1--")
time.sleep(0.1)
yield
def task2():
while True:
print("--2--")
time.sleep(0.1)
yield
def main():
t1 = task1()
t2 = task2()
while True:
next(t1)
next(t2)
if __name__ == "__main__":
main()
了解
def generator_1():
total = 0
while True:
x = yield
print('加', x)
if not x:
break
total += x
return total
def generator_2(): # 委托生成器
while True:
total = yield from generator_1() # 子生成器
print('加和总数是:', total)
def main(): # 调用方
# g1 = generator_1()
# g1.send(None)
# g1.send(2)
# g1.send(3)
# g1.send(None)
g2 = generator_2()
g2.send(None)
g2.send(2)
g2.send(3)
g2.send(None)
if __name__ == '__main__':
main()
#【子生成器】:yield from后的generator_1()生成器函数是子生成器
#【委托生成器】:generator_2()是程序中的委托生成器,它负责委托子生成器完成具体任务。
#【调用方】:main()是程序中的调用方,负责调用委托生成器。
定义:
协程的三个阶段:
案例参考:
from greenlet import greenlet
import time
# 协程利用IO 来切换任务
def demo1():
while True:
print("demo1")
gr2.switch() # 开始
def demo2():
while True:
print("demo2")
gr1.switch() # 开始
gr1 = greenlet(demo1) # 创建
gr2 = greenlet(demo2) # 创建
gr1.switch() # 开始
案例参考:
import gevent
import time
from gevent import monkey
# 将程序中用到的耗时操作, 换位gevent中实现的莫块
monkey.patch_all()
def f1(n):
for i in range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
# gevent.sleep(0.5)
def f2(n):
for i in range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
# gevent.sleep(0.5)
def f3(n):
for i in range(n):
print(gevent.getcurrent(), i)
time.sleep(0.5)
# gevent.sleep(0.5)
print("--1--")
g1 = gevent.spawn(f1, 5)
print("--2--")
time.sleep(1)
# gevent.sleep(0.5)
g2 = gevent.spawn(f2, 5)
print("--3--")
g3 = gevent.spawn(f3, 5)
print("--4--")
g1.join()
g2.join()
g3.join()
tips:
from gevent import monkey
将程序中用到的耗时操作, 换位gevent中实现的模块
monkey.patch_all()