티스토리 뷰

반응형
위에서 보는 바와 같이 asyncio는 async/await 구문을 사용를 사용하여 동시성 처리를 합니다.
 
 
다른 예를 하나 더 만들어 보겠습니다.
 
여기서는 create_task()모듈을 이용해, 아래와 같이 다른 두 가지 작업을 동시에 실행하는 코드를 작성해 보겠습니다.
 
 
우선 2의 Task를 만들도록 하겠습니다. 이 구조는 손쉽게 이해가 되시죠?, 첫번 째 예시를 참고하시면 크게 어렵지 않게 이해가 되실 겁니다.
이번 포스트에서는 파이썬의 asyncio에 대해서 알아보도록 하겠습니다.
 
간단하게 살펴보기
1. 비동기처리는 여러 Task를 동시에 수행하는 것을 의한다.
2. python은 asyncio를 통해 비동기처리를 지원한다.
3. 비동기처리를 쉽게 설명하면 아래의 그림과 같습니다.
 
일반적인(동기식) 방식은 프로그램에서 여러 테스크가 존재한다고 할 때 테스크가 순차적으로 처리됩니다. 반대로 비동기식 방식은 여러 테스크가 동시에 처리되는 방식을 말합니다.
ayncio에서는 테스크를 함수형태로 정의합니다. 그리고 그 형태는 기존의 함수 구조에서 async 키워드가 부여됩니다.간단한 예시를 살펴보겠습니다.
 
import asyncio #1

#2 비동기 task1
async def task1():
    print('I''m task1')

#3 비동기 main_task
async def mainTask():
    print('hellow')
    await task1() #3-1
    print('world')    

#asyncio.run(mainTask())​

 

#1 먼저 asyncio 모듈을 호출해서 asyncio를 사용할 수 있도록 합니다.

 
#2 비동기 Task1을 생성합니다.
 
여기서 비동기 task는 함수를 작성하는 방식과 동일하며 하나 큰 차이점은 async를 표기한다는 점입니다.
 
#3 비동기 main_task를 생성합니다.
 
#3-1 다른 비동기처리(task1)를 호출하기 위해서는 해당 함수 앞에 await를 넣어야 합니다.
 
#4 마지막으로 전체 스크립트의 시작점(asyncio.run)을 정의합니다.
 
실행결과는 아래와 같습니다.
 
 
 위에서 보는 바와 같이 asyncio는 async/await 구문을 사용를 사용하여 동시성 처리를 합니다.
 
다른 예를 하나 더 만들어 보겠습니다.
 
여기서는 create_task()모듈을 이용해, 아래와 같이 다른 두 가지 작업을 동시에 실행하는 코드를 작성해 보겠습니다.
 
 

 

우선 2의 Task를 만들도록 하겠습니다. 이 구조는 손쉽게 이해가 되시죠?, 첫번 째 예시를 참고하시면 크게 어렵지 않게 이해가 되실 겁니다.
import asyncio

async def task1():
    print('I''m task1')

async def task2():
    print('I''m task2')

async def mainTask():

    await task1()
    await task2()

asyncio.run(mainTask())
 
자 그럼 여기서 task1, task2를 함수처럼 파라미터와 리턴값을 이용하려면 어떻게 해야 할 까요? 아래와 같이 작성하면 우리가 원하는 결과 나타날까요?
import asyncio

async def task1(sentance):
   print(f"{sentance}")
   return f"task1_결과 {sentance}"

async def task2(sentance):
   print(f"{sentance}")
   return f"task2_결과: {sentance}"

async def mainTask():
   task1_result = await task1("I'm task1")
   task2_result = await task2("I'm task2")
   print(task1_result)
   print(task2_result)

asyncio.run(mainTask())
결과는 잘 나타났지만 이 정도로 잘 나온 것인지 모르겠습니다. 위의 코드를 아래와 같이 다시 수정해 보겠습니다.
import asyncio

async def sleep(): 
    await asyncio.sleep(1) 

async def task1(sentance, loopnunm): 
    for item in range(loopnunm): 
        await sleep() 
        print(f"{sentance}") 
    return f"task1_결과 {sentance}" 

async def task2(sentance, loopnunm): 
    for item in range(loopnunm) : 
        await sleep() 
        print(f"{sentance}") 
    return f"task2_결과: {sentance}" 

async def mainTask(): 
    task1_result = await task1("I'm task1", 5) 
    task2_result = await task2("I'm task2", 15) 
    print(task1_result) 
    print(task2_result) 

asyncio.run(mainTask())
이렇게 이쁘게 나오는게 좋은 것일까요?

여기서 다음 코드와 차이점을 확연하게 알 수 있도록 asyncio.sleep(1)을 주었습니다.
 
앞의 결과와 아래의 코드 결과를 실행해 보면서  한번 비교해 보도록 하겠습니다.
 
import asyncio

async def sleep():
    await asyncio.sleep(1)

async def task1(sentance, loopnum):
    for item in range(loopnum):
        await sleep()
        print(f"{sentance}")
    return f"task_결과 {sentance}"

async def task2(sentance, loopnum):
    for item in range(loopnum):
        await sleep()
        print(f"{sentance}")
    return f"task_결과 {sentance}"

async def main():
    _task1 = asyncio.create_task(task1("I'm task1", 5))
    _task2 = asyncio.create_task(task2("I'm task2", 13))

    await _task1
    await _task2

    result1 = _task1.result()
    result2 = _task2.result()

    print(result1)
    print(result2)

asyncio.run(main())

 

해당 코드의 결과를 보면 위와 다른 점이 있습니다. 차이가 보이시나요?
asyncio.create_task()를 사용할 경우 동시성, 즉 비동기식 처리가 되는 것을 확인해 볼 수 있습니다. 이전 코드는 비동기식으로 처리가 되지 않으므로 원하는 효율을 얻을 수 없습니다. asyncio를 이용할 때 반드시 관련 내용을 숙지하시기 바랍니다.
이번 포스트에서는 asyncio에 대해서 알아보았습니다. 다음 포스트에서는 asyncio의 다른 기능들에서 더 살펴보도록 하겠습니다.
계속해서 많은 관심 부탁드립니다.
 
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함