나는 이렇게 학습한다/Language

파이썬 코루틴 활용

daco2020 2022. 1. 16. 15:08
반응형

웹사이트 데이터 가져오기

1. session을 통해 url에 접속한다

2. request.get을 통해 데이터를 가져온다

3. session을 닫고 걸린 시간을 측정한다

* session을 간편하게 닫기 위해 with문을 사용했다. with문을 사용하면 with 블록을 벗어나는 순간 자동으로 close되어 편리하다.

4. 일반 코드와 코루틴 코드의 결과를 비교해본다

 

 

 

 

일반 코드의 경우(동기)

>>>
15.04025387763977 초

'''
동기로 코드를 작성할 경우
15.04025387763977 초 소요
'''


import requests
import time


def fetcher(session, url):
    with session.get(url) as response:
        return response.text


def main():
    urls = ["https://naver.com", "https://google.com", "https://daum.net"] * 10

    with requests.Session() as session:
        result = [fetcher(session, url) for url in urls]
        print(result)


if __name__ == "__main__":
    start = time.time()
    main()
    end = time.time()
    print(end - start)

 

 

 

 

코루틴 코드의 경우(비동기)

>>>
1.7667789459228516 초 소요

'''
코루틴을 활용하여 비동기로 코드를 작성할 경우(약 10배 더 빠른 처리속도를 보여준다)
1.7667789459228516 초 소요
'''

import asyncio
import aiohttp  # aiohttp~=3.7.3 버전 사용


# async 로 코루틴 함수를 만든다.
async def fetcher(session, url):
		# with 앞에 async가 붙는 이유는 await을 쓸려면 
		# 해당하는 context(영역)에 async 가 붙어야 하기 때문에 붙는 것
    async with session.get(url) as response: 
        return await response.text()


async def main():
    urls = ["https://naver.com", "https://google.com", "https://daum.net"] * 10

    async with aiohttp.ClientSession() as session:
        result = await asyncio.gather(*[fetcher(session, url) for url in urls])
        print(result)


if __name__ == "__main__":
    start = time.time()
    asyncio.run(main()) # 코루틴은 asyncio.run()으로 실행
    end = time.time()
    print(end - start)

 

이렇듯 코루틴 코드를 활용하면 훨씬 더 빠른 결과값을 받아볼 수 있다.

 

 

 


 

 

레퍼런스

반응형