Python 协程多进程并发访问URL:解决RuntimeError: Event loop is closed错误
这个错误通常出现在使用asyncio库时,当事件循环已经关闭后,再次尝试使用事件循环会引发该错误。在你的程序中,可能是在协程执行完毕后,没有正确关闭事件循环。\n\n以下是一个示例程序,演示如何使用协程和多进程并发访问URL,并正确处理事件循环的关闭:\n\npython\nimport asyncio\nimport aiohttp\nimport multiprocessing\n\nasync def fetch(session, url):\n async with session.get(url) as response:\n return await response.text()\n\nasync def process_batch(urls):\n async with aiohttp.ClientSession() as session:\n tasks = [fetch(session, url) for url in urls]\n results = await asyncio.gather(*tasks)\n return results\n\ndef process_urls(urls, max_processes):\n loop = asyncio.get_event_loop()\n results = []\n\n for i in range(0, len(urls), max_processes):\n batch = urls[i:i+max_processes]\n coroutine = process_batch(batch)\n results.extend(loop.run_until_complete(coroutine))\n\n loop.close()\n return results\n\nif __name__ == '__main__':\n # 从文件中读取URL列表\n with open('urls.txt') as file:\n urls = file.read().splitlines()\n\n # 设置每批最多的进程数\n max_processes = 5\n\n # 多进程并发处理URL\n with multiprocessing.Pool(processes=max_processes) as pool:\n results = pool.map(process_urls, [urls] * max_processes)\n\n print(results)\n
\n\n在这个示例中,我们首先定义了一个协程fetch
,用于异步获取URL的内容。然后定义了另一个协程process_batch
,用于处理一批URL,其中会创建一个ClientSession
对象来进行并发请求。\n\n在process_urls
函数中,我们获取默认的事件循环,并根据每批最多的进程数创建多个协程任务,然后使用loop.run_until_complete
方法运行这些协程,最后关闭事件循环。\n\n在if __name__ == '__main__'
块中,我们从文件中读取URL列表,并使用multiprocessing.Pool
创建了多个进程来并发处理URL。最后打印出结果。\n\n确保你已经安装了aiohttp
库,可以使用pip install aiohttp
命令进行安装。同时,将你的URL列表保存在一个名为urls.txt
的文本文件中,每行一个URL。\n\n希望这可以帮助到你解决问题!
原文地址: http://www.cveoy.top/t/topic/p3QL 著作权归作者所有。请勿转载和采集!