Python协程

我的备忘录 / 2023-06-02 / 原文

模板

  • 利用协程执行一般任务
import asyncio

async def func1():
	pass
	await asyncio.sleep()
	pass

async def func2():
	pass
	await asyncio.sleep()
	pass

async def func3():
	pass
	await asyncio.sleep()
	pass


# 方法一:
async def main():
	f1 = func1()
	await f1  # 一般await挂起操作放在协程对象前面,await必须卸载async函数里
	f2 = func2()
	await f2
	f3 = func3()
	await f3
	
# 方法二(推荐):
async def main():
	tasks = [
	asyncio.create_tasks(func1()), 
	asyncio.create_tasks(func2()), 
	asyncio.create_tasks(func3())]
	
	await asyncio.wait(tasks)


if "__name__" == "__main__":
	asyncip.run(main())
  • 协程在爬虫里的应用
import asyncio

async def download(url):
	await asyncio.sleep()  # 发起网络请求
	
async def main():
	urls= []

	tasks = []
	for url in urls:
		d = asyncio.create_tasks(download(url))
		tasks.append(d)


	await asyncio.wait(tasks)

if "__name__" == "__main__":
	asyncio.run(main())
	
  • 进一步完善
import asyncio
import aihttp


async def aiodownload(url):
	name = something
	async with aiohttp.ClinetSession() as session:
		async with session.get() as response:
			response.content.read()
			response.text() # 必须加()
			repsonse.json()
			# 可以学习aiofiles模块,改善写入文件效率
			with open(name, mode="wb") as f:
				f.write(awit response.content.read()) # 读取内容是异步的,需要挂起