协程的意义:利用堵塞/延时时间做其他操作
协程依赖于线程,线程依赖于进程
import gevent
import time
from gevent import monkey
# 监测整个代码耗时的位置,将程序中耗时操作的代码,换成gevent中自己实现的模块
monkey.patch_all() # 不需要改time 和 gevent 之间增加
def f(n):
for i in range(n):
print(gevent.getcurrent(), i)
# gevent.sleep(0.1) # 自带的延时才能启动延时自动切换
time.sleep(0.5)
g1 = gevent.spawn(f, 5) # 创建对象1
g2 = gevent.spawn(f, 5) # 创建对象2
g3 = gevent.spawn(f, 5) # 创建对象3
g1.join() # 遇到延时自动切换下一个
g2.join() # 遇到延时自动切换下一个
g3.join() # 遇到延时自动切换下一个
# 用joinall批量执行,不需要逐个join
gevent.joinall([
gevent.spawn(f, 5),
gevent.spawn(f, 4),
gevent.spawn(f, 3)
])
图片下载器
import urllib.request
import gevent
from gevent import monkey
monkey.patch_all()
def download(img_name, img_url):
req = urllib.request.urlopen(img_url)
img_content = req.read()
with open(img_name, 'wb') as f:
f.write(img_content)
def main():
gevent.joinall([
gevent.spawn(download, '1.jpg', 'https://rpic.douyucdn.cn/live-cover/roomCover/2020/04/13/60a4ec3d32497b2d2886c995320c7382_big.jpg'),
gevent.spawn(download, '2.jpg', 'https://rpic.douyucdn.cn/live-cover/appCovers/2019/11/16/5481874_20191116171227_small.jpg')
])
if __name__ == '__main__':
main()