Error del rastreador de rutina asincrónica de Python: [aiohttp.client_exceptions: ServerDisconnectedError: servidor desconectado] solución inicial

Código inicial:

async def myRequest(data):
    url = data['url']
    header = data['header']
    country = data['country']
    category = data['category']
    async with aiohttp.ClientSession(headers = header) as session:
        async with await session.get(url = url) as resp:
            html = await resp.read()
            today = str(datetime.date.today())
            filePath = '%s.xlsx'%(category)
            absPath = os.path.join(dir, today, country, filePath)
            print(absPath, 3333)
            f = open(absPath, 'wb')
            f.write(html)
            f.close()

def main():
    tasks = []
	for url in urls:
		c= myRequest(requestDataList, headers)
		task = asyncio.ensure_future(c)
		tasks.append(task)
	loop = asyncio.get_event_loop()
	loop.run_until_complete(asyncio.wait(tasks))

if __name__ == '__main__':
	main()
async def download_page(url):
	async with aiohttp.ClientSession() as session:
		async with session.get(url) as resp:
			await result = resp.text()

async def main(urls):
	tasks = []	
	for url in urls:
		tasks.append(asyncio.create_task(download_page(url)))  # 我的python版本为3.9.6
	await asyncio.await(tasks)

if __name__ == '__main__':
	urls = [ url1, url2, …… ]
	asyncio.run(main(urls))

Este es el marco de rutina asincrónico más básico. Cuando la cantidad de datos no es grande, básicamente puede cumplir con los requisitos. Sin embargo, si la cantidad de datos es un poco mayor, se informará un error. Los mensajes de error que he recopilado son los siguientes sigue:

  • aiohttp.client_exceptions.ClientOSError: [WinError 64] El nombre de red especificado ya no está disponible.
    La excepción de tarea nunca se recuperó

  • aiohttp.client_exceptions.ClientOSError: [WinError 121] El tiempo de espera del semáforo ha expirado. La
    excepción de tarea nunca se recuperó

  • aiohttp.client_exceptions.ServerDisconnectedError: servidor desconectado
    La excepción de tarea nunca se recuperó

Soluciones:

El gran problema con el informe de error anterior es que cada tarea crea una sesión y se informará un error cuando se creen demasiadas sesiones.

Solución:

intenta crear solo una sesión

import asyncio
import aiohttp

async def download_page(url,session):
	async with session.get(url) as resp:
		result = await resp.content.read()
		print(result)

async def main(urls):
	tasks = []	
	async with aiohttp.ClientSession() as session:  # 将创建session,放在main函数中,同时,需要注意将session作为变量传入download_page函数中
		for url in urls:
			tasks.append(asyncio.create_task(download_page(url,session)))
			# 我的python版本为3.9.6,python版本3.8及以上,如果需要创建异步任务,需要通过asyncio.creat_task()创建,否则虽然可以正常运行,但是会出警告信息
		await asyncio.wait(tasks)

if __name__ == '__main__':
	urls = [ url1, url2, …… ]
	asyncio.run(main(urls))

Supongo que te gusta

Origin blog.csdn.net/zhuan_long/article/details/130340436
Recomendado
Clasificación