Skip to main content
 首页 » 编程设计

python之如何使用 asyncio 和 multiprocess.map 获取数据

2024年11月24日28zhengyun_ustc

我正在使用 asyncio 获取网页。

但是,速度不是很高。

代码如下:

async def get_page_url(url, session): 
    res = await session.request(method="GET", url=url) 
    return await res.text() 
 
async def main_get_page_url(urls):       
    async with ClientSession() as session: 
    tasks = [get_page_url(url, session) for province, url in urls] 
    result = await asyncio.gather(*tasks) 
    return result 
 
if __name__ == '__main__': 
    urls = ['http://www.cnn.com', 'http://www.bbc.com'] 
    loop = asyncio.ProactorEventLoop() 
    asyncio.set_event_loop(loop) 
    loop = asyncio.get_event_loop() 
    df = loop.run_until_complete(main_get_page_url(urls)) 

我想使用 multiprocessing.pool 和 map 来提高速度。

我在网上搜索过,没有找到任何好的方法。

如何修改代码?

还有其他更好的方法吗?

非常感谢

请您参考如下方法:

使用更多流程您将一事无成。 99% 的脚本执行时间占用您已经使用 asyncio.gather 处理的网络 I/O。只有 1% 的时间占用 CPU。优化它已经不值得投入时间和增加代码复杂性。事实上,产生多个进程的成本可能反而会减慢您的脚本。

如果您认为您的代码运行速度比实际情况慢,您应该首先找到瓶颈并尝试对其进行优化。如果没有带有实际代码、URL 和时间测量的完全可重现的示例,将无法为您提供更多帮助。


免责声明:

99% of script execution time takes network I/O

这是非常粗略的近似值,但很公平,看看this answer尤其是最后的结果。