网站首页Python相关

Python3.6异步请求

发布时间:2017-08-10编辑:fc不将就阅读(1783

        Python3.5之后正式添加了两个异步的关键字async和await用以编写异步代码。

        python中用得最多的http请求库requests目前并不支持异步请求,下面通过新增的关键字实现异步请求网页.与对比同步请求消耗的时间进行对比.为了防止网络波动的干扰,循环10次求平均值

    import asyncio
    import requests
    import time
    
    host = ""
    urls_todo = ["https://linux.cn/tech/",
                 "http://python.jobbole.com/",
                 "http://www.v2ex.com/",
                 "https://www.baidu.com/",
                 "http://www.dongwm.com/"]
    loop = asyncio.get_event_loop()
    
    async def request_test(url):
        future = loop.run_in_executor(None, requests.get, url)
        response = await future
        print(response.status_code)
        return response
    
    
    def main(_type: str):
        if _type == "sync":
            start = time.time()
            for url in urls_todo:
                r = requests.get(host + url)
                print(r.status_code)
            return time.time() - start
    
        if _type == "asyncio":
            start = time.time()
            tasks = [request_test(host + url) for url in urls_todo]
            loop.run_until_complete(asyncio.gather(*tasks))
            return time.time() - start
    
    
    if __name__ == '__main__':
        sync_times = []
        asyncio_times = []
        for i in range(10):
            sync_times.append(main("sync"))
            asyncio_times.append(main("asyncio"))
            time.sleep(2)
        print("sync use time:", sum(sync_times)/len(sync_times))
        print("async use time:", sum(asyncio_times)/len(asyncio_times))

        结果,可以看到异步方式速度提升很大

    sync use time: 1.2995498418807983
    async use time: 0.4930880069732666