我正在使用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))
并映射以提高速度。
我已经在网上搜索了,但是找不到任何好的方法。
如何修改代码?
还有其他更好的方法吗?
非常感谢您
答案 0 :(得分:1)
使用更多的流程将无济于事。脚本执行时间的99%占用了您已经使用asyncio.gather
处理过的网络I / O。只有1%的时间占用CPU。优化它已经不值得花费时间和增加代码复杂性。如果产生多个进程的事实成本可能反而会使您的脚本变慢。
如果您认为您的代码运行速度慢于预期,则应首先找到瓶颈并尝试对其进行优化。如果没有完全可复制的示例,包括实际代码,URL和时间度量,将无法为您提供更多帮助。
免责声明:
99%的脚本执行时间需要网络I / O
这是一个非常近似的近似值,但是很公平,请看一下this answer,尤其是最后的结果。