반응형

 

 

async io의 단어적 뜻은 Asynchronous IO 라는 단어적 뜻을 가지고 있다

동시성으로 여러개의  비동기 IO-Bound 작업들을 관리하는 것을 그 목적으로 가진다

 

AsyncIO를 사용하기 위해서는 기본적인 키워드 2개에 대해서 알고 있어야 한다

 

async, await 가 바로 그 두개의 키워디 인데,

 

함수 앞에 async 를 붙이게 되면, 해당 함수가 코루틴 객체로 바뀌면서 async io에서 사용이 가능하다

그리고 await 키워드는 뒤에 특정 작업 ( awaitable 속성을 가진 객체) 을 넣어주면 실행이 가능한 상황이다.

 

import asyncio

async def test_task():
    print("Hello World!")
    await asyncio.sleep(2)
    
    print("end")
    return "OKAY"
    


async def main():
    task1 = asyncio.create_task(test_task())
    task2 = asyncio.create_task(test_task())
    
    result = await asyncio.gather(task1, task2)


if __name__ == "__main__":
	await main()

 

 

 

 

async 키워드가 붙지 않는 함수에서도 asyncio를 사용하고 싶을 순간이 있을것이다.

그럴때는 쓰레드를 이용해서 asyncio를 구현을 하면 가능해진다

 

import asyncio
import time
import threading

lock = threading.Lock()


def block_task(task):
    with Lock:
        print(task, "Hello")
    
    time.sleep(1)
    
    with Lock:
        print(task,"World")
    return "OK"


async def main():
    loop = asyncio.get_running_loop()
    
    r1 = loop.run_in_executor(None, blocked_task, "Task1")
    r2 = loop.run_in_executor(None, blocked_task, "Task2")
    
    
    result = await asyncio.gather(r1,r2)
    
    print(result)


if __name__ =="__main__":
    await main()

 

 

 

일반적으로 파이썬에서 http 통신을 위해서는 request 패키지를 임포트해서 사용을 하는데, 이 패키지를 사용하면서 asyncio를 사용하기 위해서는 쓰레드를 위한 코드도 생성해야지 사용이 가능하다. 따라서 번거로움이 많아지는데,

aiohttp라는 패키지를 사용을 하면 번거로움이 사라진다.

 

 

반응형

'CS > 파이썬' 카테고리의 다른 글

파이썬 이터레이터 만들기 ( python iterator )  (0) 2022.09.01
동시성과 병렬성에 관한 정리  (0) 2022.08.11

+ Recent posts