삽집하는 개발들/Python

Python 비동기

악투 2019. 6. 22. 21:29
반응형

Python을 만진지 고작... 6개월정도 됐는 데... 흑흑...

어떤 json 데이터를 가져오기 위해 여러개의 URL로 요청을 하여 받아오는 구조를 만들어야하는 상황이 발생했다...

처음 간단히 생각했던 건 request.get을 이용하여 받아오려고 코드를 짜기 시작했다...

회사에서 썼던 URL은 쓸 수 없으니까 google, naver, nate 로 대체해서 코드를 보여드립니다. 

아주 아주 아주 간단한 코드이다. 예외처리나 DATA 가공 또한 없다. 핵심은 해당 데이터를 가져오는 시간에 있다!!! 

# -*- coding: utf-8 -*-
import time
import requests
from datetime import datetime

# 작업시작 시간!
start_time = datetime.now()

# DATA를 가져올 URL! 

#
urls = ['https://www.google.com', 'https://www.naver.com', 'https://www.nate.com']


# Request를 이용하여 DATA 가져오기
data = {url : requests.get('{url}'.format(url=url)).text for url in urls}

# DATA print!
print(data)

# 작업 종료 시간!
end_time = datetime.now()
result = end_time - start_time
print(result)

위 코드를 사용시 DATA와 종료시간이 나온다. DATA를 print를 하다보니 DATA가 많다면, 종료시간이 길어질 수 있다. DATA를 잘 받아오는 지 확인 후 print는 지워주자! 

3개의 URL 밖에 요청을 안했는 데, 0.48초나 걸렸다...(네트워크 상황에 따라 시간을 달라질 수 있습니다!!!)

똑같은 URL를 10번을 더 요청해서 시간을 다시 체크해본다!

urls = ['https://www.google.com', 'https://www.naver.com', 'https://www.nate.com'] * 10

이렇게 30번 요청을 하게 되겠죠?!

그래서 걸린 시간이!!! 무려

5초나 걸렸다... 저 같은 경우 60개 이상되는 데이터를 요청해야하고 약 5초안에 끝내야하는 상황인지라 비동기를 사용해야겠다는 생각을 했다!

그리하여! 새롭게 나온 코드!

async def vts_json(url):
    async with aiohttp.ClientSession() as client:
        try:
            async with client.get(url) as resp:
                if resp.status == 200:
                    data = await resp.text(encoding='windows-1251')
                    json_data = json.loads(data)
                    return json_data
        except aiohttp.ClientError:
            pass

urls = ['https://www.google.com', 'https://www.naver.com', 'https://www.nate.com']

async def main():
    vts_data = {url: await vts_json('{url}'.format(url=url)) for url in urls}
    return vts_data
반응형