-
python에서 비동기 프로그래밍 하기 (feat. Asyncio)카테고리 없음 2019. 10. 1. 19:28
안녕하세요! 오늘은 Asyncio 라이브러리에 대해서 알아보겠습니다.
Asyncio는 파이썬에서 비동기 프로그래밍이 가능하도록 해주는 라이브러리 입니다. 본문에 들어가기 앞서 동기(synchronous) , 비동기(asynchronous)에 대해서 간략히 알아 보겠습니다.
1. Synchronous(동기) vs Asynchronous(비동기)
동기(synchronous)는 어떤 작업이 실행되고, 그 작업이 처리되기 까지 다른 작업을 실행할 수 없습니다. 처음 실행한 작업이 처리되고 난 다음 순차적으로 다음 작업이 실행됩니다.
반면에 비동기(asynhronous)는 한 작업이 실행하고, 작업이 처리되고 끝날 때까지 기다리지 않고 다음 작업을 실행합니다. 처음 실행한 작업이 끝났다고 신호가 오면 다시 처리해줍니다.
1. Asyncio 란?
AsyncioAsyncio 는 async/await 문법을 사용해 동시성(concurrent) 코드를 쓸수 있게 해주는 라이브러리 입니다.
Asyncio는 multiple python asynchronous(비동기) frameworks 를 위한 기초로 사용되며, high-performance network 그리고 web-servers, database connection libraries, distributed task queues 등을 제공합니다.Asyncio 문서: https://docs.python.org/3/library/asyncio.html
asyncio — Asynchronous I/O — Python 3.7.4 documentation
docs.python.org
2. Asynchronous programming (비동기 프로그래밍)
비동기 코드를 사용할 수 있으면 어떤 이점이 있을까요? 간단하게는 오래걸리는 작업을 실행했을때 결과를 기다리지 않고 다음 작업을 실행할 수 있다는 이점이 있을 수 있겠네요! 비동기로 처리하면 여러작업이 동시에 실행되고 그 결과가 끝날때마다 알려주니까요^^
간단한 예제로 테스트를 해보겠습니다.
1234567891011121314151617181920212223242526272829303132333435#-- coding: utf-8 --import asynciofrom time import time, sleep''' 동기로 sleep 호출 '''def sleep_test(i):print("start sleep {}".format(i))sleep(1.0)begin = time()for i in range(0, 5):sleep_test(i)end = time()print("동기로 실행 시간: {0:.3f}초\n\n".format(end - begin))''' 비동기로 sleep 호출 '''async def async_sleep_test(i):print("start sleep {}".format(i))await asyncio.sleep(1.0)async def main():aws = [async_sleep_test(i) for i in range(0, 5)]await asyncio.gather(*aws)begin = time()loop = asyncio.get_event_loop() # 이벤트 루프를 얻음loop.run_until_complete(main()) # main이 끝날 때까지 기다림loop.close() # 이벤트 루프를 닫음end = time()print("비동기로 실행 시간: {0:.3f}초".format(end - begin))cs 동기로 sleep(1.0)을 호출합니다. 예상되는 결과로는 1초마다 start slepp {i} 문구가 출력됩니다.
반면에, 비동기로 sleep(1.0) 호출하는 코드를 보겠습니다.
먼저 asyncio.sleep 메소드를 사용합니다. 기본적으로 sleep()과 같은 기능이지만, asyncio.sleep()은 coroutine 메소드 입니다. 함수가 종료되면 결과를 리턴해줍니다.
asycio.gather() 메소드는 입력받은 *aws에 있는 awaitable objects(asyncioAPI)들을 동시에 실행합니다. (Task를 동시에 실행)async def main()을 보면 astnc_sleep_test()값을 리스트 형태로 만들어준 뒤, 만들어진 async task들을 asyncio.gather()로 한번에 실행시켜줍니다. 백문이 불여일견!! 결과를 한번 확인해보죠!
동기, 비동기로 처리되는 python 코드 결과 영상을 보니까 그 체감이 확 느껴지죠? 동기로 실행되는 코드는 순차적으로 출력되는 반면에, 비동기 코드들은 한번에 실행! 딱!
요것은 신세계여~!! 3. 마치며
다양한 기능을 제공하는 asyncio 이것으로 아~주 간단하게 python에서 비동기로 프로그래밍하는 방법을 알아 보았는데요. asynio는 이 외에도 Coroutines(코루틴)을 생성하거나 여러가지 기능이 있으니 한번 살펴보시면 좋을 것 같아요
어떻게 쓰느냐에 따라 유용하게 쓰일 것 같습니다. 오늘도 즐거운 코딩하세요!!:D