×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,281,543명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
강현대 : 5000원(busyhuman)

Asyncio란?

async def 함수이름():
    코드

 

어떤 데이터를 작성과 동시에 계속해서 저장하는 프로그램을 만들고 싶은데

저장하는 양이 크다보니 작성과 동시에 저장을하면 화면이 멈추는 듯한 렉이 걸리게 될 수 있다.

 

이럴때 작성 -> 저장 -> 작성 -> 저장 -> 작성 -> ... 의 방식처럼 동기식으로 프로그래밍을 만드는 것이 아닌

작성 -> 작성 -> ...

저장 -> 저장 -> ...

방식처럼 비동기식 병렬적으로 만드는 방법을 파이썬에서 확인해보고자 한다.

 

파이썬에서 asyncio(Asynchronous I/O)는 비동기 프로그래밍을 위한 모듈이며 CPU 작업과 I/O를 병렬로 처리하게 해준다.

 

 

Asyncio 사용하기

 

asyncio를 사용하기 위해서는 아래 코드와 같이 async def로 네이티브 코루틴을 만들어야 한다.

(이때 파이썬에서는 제너레이터 기반의 코루틴과 구분하기 위해 async def로 만든 코루틴은 네이티브 코루틴이라고 한다.)

async def 함수이름():
    코드

** async def 키워드는 파이썬 3.5 이상부터 사용 가능

 

 

그렇다면 이렇게 만든 네이티브 코루틴을 실행할 수 있어야하는데 이는 아래 코드에서 확인 가능하다.

아래 코드는 두 수를 더한 후 3초간 대기한 후 리턴해주는 코드이다.

import asyncio
 
async def add(a, b):
    print('add: {0} + {1}'.format(a, b))
    await asyncio.sleep(3.0)    # 3초 대기. asyncio.sleep도 네이티브 코루틴
    return a + b    # 두 수를 더한 결과 반환
 
async def print_add(a, b):
    result = await add(a, b)    # await로 다른 네이티브 코루틴 실행하고 반환값을 변수에 저장
    print('print_add: {0} + {1} = {2}'.format(a, b, result))
 
loop = asyncio.get_event_loop()             # 이벤트 루프를 얻음
loop.run_until_complete(print_add(1, 2))    # print_add가 끝날 때까지 이벤트 루프를 실행
loop.close()                                # 이벤트 루프를 닫음

 

아래 순서를 통해 코드에 대해 자세히 한번 알아보자

 

1. asyncio.get_event_loop 메서드로 이벤트 루프를 얻어낸다.

 

2. loop.run_until_complete(~) 메서드에 print_add(1,2) 코루틴 객체를 넣는다.

(네이티브 코루틴을 호출하면 코루틴 객체가 생성된다.)

run_until_complete는 네이티브 코루틴이 이벤트 루프에서 실행되도록 예약하고, 해당 네이티브 코루틴이 끝날 때까지 기다린다. 즉, 이벤트 루프를 통해 print_add(1,2)가 실행이 된다.

 

3. 할 일이 끝났으면 loop.close로 이벤트 루프를 닫아준다.

 

4. print_add에서는 await add를 실행하고 반환값을 변수에 저장했습니다. 이렇게 코루틴 안에서 다른 코루틴을 실행할 때는 await를 사용한다.

add: 1 + 2
print_add: 1 + 2 = 3