본문 바로가기
wecode/TIL 정리

위코드 Pre Course - 파이썬의 Co-routine

by 왕거 2020. 7. 28.

파이썬에서의 코루틴에 대해서 정리한다.

 

Coroutine이란?

  • 제네레이터의 확장 방식
  • 한번 코루틴을 실행하면 계속 상주하면서 호출에 대응하는 방식

Assignment

1. 호출 시 마다 good 문자열이 추가되도록 코드를 만들기

# Assignment 1 - good 문장열이 추가되어서 출력되도록 만들기

import time

def coroutine_test():
    greeting = "good "
    while True:
        text = (yield greeting)
        print(greeting + text)

if __name__ == "__main__":
    cr = coroutine_test()
    print("cr=",end=""), print(cr)

    next(cr)
    time.sleep(2)

    print("send 1")
    cr.send("morning")
    time.sleep(2)

    print("send 2")
    cr.send("afternoon")
    time.sleep(2)

    print("send 3") 
    cr.send("evening")
    time.sleep(2)
    
###################################################3
# 실행 결과
cr=<generator object coroutine_test at 0x7fced9bc3740>
send 1
good morning
send 2
good afternoon
send 3
good evening

 

2. asyncio를 사용한 1억 누적 프로그램 코드

# Assignment 2 - 5천만씩 누적하여 1억까지 누적하기

import asyncio

async def coroutine_1(num):
    result_value = 0
    while result_value < num:
        result_value += 1
    return result_value

async def coroutine_2(num):
    result_value = 0
    while result_value < num:
        result_value += 1
    return result_value

async def main():

    c1 = await coroutine_1(50000000)
    c2 = await coroutine_2(50000000)
    print("ret_value =",end="")
    print(one+two)
    print("end of main")
    
if __name__ == "__main__":

    loop = asyncio.get_event_loop()

    loop.run_until_complete(main())

    loop.close()
    
#################################################
# 실행 결과
ret_value =100000000
end of main

 

Asyncio

  • asyncio는 async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리
  • 고수준으로 구조화된 네트워크 구조에 적합
  • 다음과 같은 작업을 위한 API 제공
    • 코루틴들을 동시에 실행하고 실행을 제어

    • 네트워크 IO및 IPC를 수행

    • 자식 프로세스를 제어

    • 큐를 통해 작업을 분산

    • 동시성 코드를 동기화

https://docs.python.org/ko/3/library/asyncio.html- asyncio 파이썬 문서