1,协程yield
比线程更小的执行单元,自带cpu上下文,
线程与进程是操作系统分配,cpu调度
线程非常耗性能
协程一秒钟可以上百万次
用yielg可以实现协程,但是基本不用,因为需要手动操作,极其麻烦
import time
def work_1():
while True:
print('work1')
time.sleep(0.1)
yield
def work_2():
while True:
print('work2')
time.sleep(0.1)
yield
def main():
t1 = work_1()
t2 = work_2()
#先让t1运行一会儿,当t1中遇到yield的时候,再返回到24行,然后执行t2,当它遇到yield的时候,再次切换到t1中,这样t1/t2/t1/t2交替执行,最终实现多任务协程。
while True:#相当于任务分配者
next(t1)
next(t2)
if __name__ == '__main__':
main()
2,协程greenlet(半自动)
需要使用遍历
from greenlet import greenlet
import time
def work1():
while True:
print('work1')
g2.switch()
time.sleep(0.1) # 模拟将来可能会出现的耗时操作
def work2():
while True:
print('work2')
g1.switch()
time.sleep(0.1)
if __name__ == '__main__':
# 创建协程
g1 = greenlet(work1)
g2 = greenlet(work2)
# 切换到g1,g2中进行运行
g1.switch()
g2.switch()
while True:
next(g1)
next(g2)
3,协程gevent(全自动)
全自动协程
import gevent
def func(num):
for i in range(num):
print(gevent.getcurrent(), i)
gevent.sleep(0.5)
g1 = gevent.spawn(func, 5)
g2 = gevent.spawn(func, 6)
g3 = gevent.spawn(func, 7)
g1.join() # 等待g1执行完
g2.join()
g3.join()
遇到延时就切换,
import gevent
def func1(num):
for i in range(num):
print(gevent.getcurrent(), i)
def func2(num):
for i in range(num):
print(gevent.getcurrent(), i)
def func3(num):
for i in range(num):
print(gevent.getcurrent(), i)
print('111111')
g1 = gevent.spawn(func1, 5)#创建对象,
print('222222')
g2 = gevent.spawn(func2, 6)
print('333333')
g3 = gevent.spawn(func3, 7)
print('444444')
g1.join()
g2.join()
g3.join()
111111
222222
333333
444444
<Greenlet at 0x1be87990248: func1(5)> 0
<Greenlet at 0x1be87990248: func1(5)> 1
<Greenlet at 0x1be87990248: func1(5)> 2
<Greenlet at 0x1be87990248: func1(5)> 3
<Greenlet at 0x1be87990248: func1(5)> 4
<Greenlet at 0x1be87990548: func2(6)> 0
<Greenlet at 0x1be87990548: func2(6)> 1
<Greenlet at 0x1be87990548: func2(6)> 2
<Greenlet at 0x1be87990548: func2(6)> 3
<Greenlet at 0x1be87990548: func2(6)> 4
<Greenlet at 0x1be87990548: func2(6)> 5
<Greenlet at 0x1be87990648: func3(7)> 0
<Greenlet at 0x1be87990648: func3(7)> 1
<Greenlet at 0x1be87990648: func3(7)> 2
<Greenlet at 0x1be87990648: func3(7)> 3
<Greenlet at 0x1be87990648: func3(7)> 4
<Greenlet at 0x1be87990648: func3(7)> 5
<Greenlet at 0x1be87990648: func3(7)> 6
476

被折叠的 条评论
为什么被折叠?



