Python -协程:案例-原理简介

本文简要介绍了Python协程的工作原理,重点在于使用yield关键字创建生成器,并探讨了协程如何实现轻量级并发。通过gevent库进行协程打补丁和并发操作,展示了如何在爬虫中利用协程提高图片下载效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python -协程案例-原理简介

Python协程实现原理
  1. 利用Python中yield关键字修饰函数使其成为生成器
  2. 利用生成器特点:可迭代且是从yield修饰处开始
  3. 协程近似函数调用,因此所用的资源少于进程和线程
  4. 可实现并发操作
  5. 以下为原理测试代码
def test_1():
	while True:
		print("----1---")
		time.sleep(1)
		yield

def test_2():
	while True:
		print("----2---")
		time.sleep(1)
		yield

t1 = test_1()
t2 = test_2()
for i in range(4):
	
	next(t1)
	next(t2
简单利用协程案例
  1. 使用利用上述原理封装的库:gevent
  2. 接下来 多打代码少动脑
  3. monkey.patch_all() 用于协程打补丁
  4. gevent.joinall([]) 用于开始多个协程
  5. gevent.spawn(function,…)传入协程执行的函数,及其他参数
  6. 由于爬取图片耗时最长就在等待响应和下载过程,多张图片的爬取这个过程,通过并发即可提高效率
import urllib.request
import gevent
from gevent import monkey

monkey.patch_all()

def download(img_name,url):
	req = urllib.request.urlopen(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/appCovers/2018/10/09/4403598_20181009234622_small.jpg"),
		gevent.spawn(download,"2.jpg","https://rpic.douyucdn.cn/live-cover/appCovers/2018/10/11/5763744_20181011182233_small.jpg"),
		gevent.spawn(download,"3.jpg","https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/13/5960450_20181213135411_small.jpg")
		])

if __name__ == "__main__":
	main()
案例结果示例

win+r  cmd  跳转到响应文件夹下  Python  文件名.py

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值