반응형
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 |