파이썬의 비동기적 프로그래밍을 위해서는 코루틴을 활용해야한다.
메인루틴
코루틴 또는 서브루틴으로 이루어져 일련의 흐름을 생성한다.
서브루틴
import time
#서브루틴
def delivery(name,mealtime):
print(f"{name}에게 배달완료!")
time.sleep(mealtime)
print(f"{name}식사 완료, {mealtime}시간 소요...")
print(f"{name}그릇수거 완료")
#서브루틴
def main():
#A라는 사람은 음식을 3초동안 먹는다.
delivery("A",5)
#B라는 사람은 음식을 4초동안 먹는다.
delivery("B",4)
#C라는 사람은 음식을 5초동안 먹는다.
delivery("C",3)
#메인루틴
if __name__=="__main__":
start = time.time()
result=main()
print("실행시간 :", time.time() - start,"seconds")
코루틴
예시코드
import time
import asyncio
#코루틴
async def delivery(name,mealtime):
#위의 인자==진입점 1
print(f"{name}에게 배달완료!")
#아래의 await==탈출점1
await asyncio.sleep(mealtime)
#위의 await==진입점2
print(f"{name}식사 완료, {mealtime}시간 소요...")
print(f"{name}그릇수거 완료")
#생략된 retun==탈출점2
#코루틴
async def main():
await asyncio.gather(
delivery("A",5),
delivery("B",4),
delivery("C",3)
)
#메인루틴
if __name__=="__main__":
start = time.time()
asyncio.run(main())
print("실행시간 :", time.time() - start,"seconds")
서브루틴은 인자로 인해 하나의 진입점과 return으로 인해 하나의 탈출점을 갖지만 코루틴에서는 await구문으로 여러개의 진입점과 탈출점을 가질 수 있다.
코루틴의 사용법
async/await
import asyncio
async def async_hello_world():
print("Hello world")
return True
asyncio.run()
import asyncio
async def async_hello_world():
print("Hello world")
return True
if __name__=="__main__":
asyncio.run(async_hello_world())
await는 awaitable객체(코루틴,테스크,퓨처)만 사용될 수 있다.
import asyncio
async def async_hello_world(keyword):
print("Hello ",keyword)
return True
async def main():
#미리 코루틴을 변수로 생성한다.
task1=asyncio.create_task(async_hello_world("영희"))
task2=asyncio.create_task(async_hello_world("민수"))
await task1
await task2
if __name__=="__main__":
asyncio.run(main())
asyncio.gather의 awaitable객체의 동시 실행
import time
import asyncio
async def delivery(name,mealtime):
print(f"{name}에게 배달완료!")
await asyncio.sleep(mealtime)
print(f"{name}식사 완료, {mealtime}시간 소요...")
print(f"{name}그릇수거 완료")
return name
async def main():
result=await asyncio.gather(
delivery("A",5),
delivery("B",4),
delivery("C",3)
)
print("result:",result)
if __name__=="__main__":
start = time.time()
asyncio.run(main())
print("실행시간 :", time.time() - start,"seconds")
$ python async_delivery.py
A에게 배달완료!
B에게 배달완료!
C에게 배달완료!
C식사 완료, 3시간 소요...
C그릇수거 완료
B식사 완료, 4시간 소요...
B그릇수거 완료
A식사 완료, 5시간 소요...
A그릇수거 완료
result: ['A', 'B', 'C']
실행시간 : 5.0111119747161865 seconds
(coding_test_env)