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

时间:2019-03-29 14:13:03

标签: python multiprocessing python-asyncio

我正在使用asyncio来获取网页。

但是,速度不是很高。

代码如下:

:db            # => "2007-12-04 00:00:00"
:number        # => "20071204000000"
:short         # => "04 Dec 00:00"
:long          # => "December 04, 2007 00:00"
:long_ordinal  # => "December 4th, 2007 00:00"
:rfc822        # => "Tue, 04 Dec 2007 00:00:00 +0000"
:iso8601       # => "2007-12-04T00:00:00+00:00"

我想使用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)) 并映射以提高速度。

我已经在网上搜索了,但是找不到任何好的方法。

如何修改代码?

还有其他更好的方法吗?

非常感谢您

1 个答案:

答案 0 :(得分:1)

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

如果您认为您的代码运行速度慢于预期,则应首先找到瓶颈并尝试对其进行优化。如果没有完全可复制的示例,包括实际代码,URL和时间度量,将无法为您提供更多帮助。


免责声明:

  

99%的脚本执行时间需要网络I / O

这是一个非常近似的近似值,但是很公平,请看一下this answer,尤其是最后的结果。