ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • python에서 비동기 프로그래밍 하기 (feat. Asyncio)
    분류없음 2019.10.01 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 (비동기 프로그래밍)


    비동기 코드를 사용할 수 있으면 어떤 이점이 있을까요? 간단하게는 오래걸리는 작업을 실행했을때 결과를 기다리지 않고 다음 작업을 실행할 수 있다는 이점이 있을 수 있겠네요! 비동기로 처리하면  여러작업이 동시에 실행되고 그 결과가 끝날때마다 알려주니까요^^

    간단한 예제로 테스트를 해보겠습니다.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #-- coding: utf-8 --
    import asyncio
    from time import time, sleep
     
     
    ''' 동기로 sleep 호출 '''
    def sleep_test(i):
        print("start sleep {}".format(i))
        sleep(1.0)
     
     
    begin = time()
    for i in range(05):
        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(05)]
        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

    댓글 0

운동하는 개발자 JAY-JI