协程
使用yeild实现协程
- 使用yeild冻结代码以及next唤醒代码方式实现
- 协程一定是并发的
- 协程可以节约资源
代码示例
import time
def work1():
while True:
print('正在扫地---')
yield
def work2():
while True:
print('正在搬砖---')
yield
w1 = work1()
w2 = work2()
# 协程肯定是并发执行
while True:
next(w1)
next(w2)
使用greenlet 创建协程
greenlet第三方模块,手动的切换任务
greenlet().switch() 切换任务
代码示例
import time
from greenlet import greenlet
def test1():
while True:
print("---A--")
gr2.switch()
time.sleep(0.5)
def test2():
while True:
print("---B--")
gr1.switch()
time.sleep(0.5)
gr1 = greenlet(test1)
gr2 = greenlet(test2)
#切换到gr1中运行
gr1.switch()
使用gevent创建协程
- 当遇到耗时任务的时候,比如文件,网络操作的时候,会自动切换到其他的greenlet
- 使用gevent创建协程程序中的主线程是不会等待gevent任务结束而结束的,所以需要增加join操作,让主线程等待gevnet任务执行完毕
- gevent的耗时操作,必须是gevent自己的功能才能识别,使用gevent下的耗时操作,比如gevent.sleep()等
如果继续使用之前的耗时操作,那么在程序开头处需要增加下面两个内容:
from gevent import monkey # 找来猴子 monkey.patch_all() # 使用猴子来打补丁,打补丁之后所有的耗时操作都会被替换为 gevent 的调用
gevent基本使用
代码示例
import gevent
import time
def func1():
while True:
print('func1-----')
gevent.sleep(1) # gevent 的耗时操作,必须是 gevent自己的功能才能识别
def func2():
while True:
print('func2----')
gevent.sleep(1)
g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)
# 主线程不会等待 gevent 任务结束
g1.join()
g2.join()
gevent高级使用
代码示例
import gevent
import time
from gevent import monkey # 找来猴子
monkey.patch_all() # 使用猴子来打补丁,打补丁之后所有的耗时操作都会被替换为 gevent 的调用
def func1():
while True:
print('func1-----')
time.sleep(1)
def func2():
while True:
print('func2----')
time.sleep(1)
g1 = gevent.spawn(func1)
g2 = gevent.spawn(func2)
# 主线程不会等待 gevent 任务结束
g1.join()
g2.join()