- asyncio
- trio
- anyio
파이썬은 동기적인 언어라서 비동기 작업이 어려웠다.
그 아쉬움을 해소하기 위해 채택된 표준 비동기 라이브러리
동기/비동기/직렬/동시 구분하기
https://velog.io/@jaybon/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0%EC%A7%81%EB%A0%AC%EB%8F%99%EC%8B%9C
사용하기 좀 더 쉬워진 비동기 라이브러리.
asyncio와의 호환성이 부족하다.
문서가 잘되어있다.
사용하기 쉬우면서도 asyncio, trio가 가지고 있는 기능들을 대부분 사용할 수 있다
(문서가 부족한 편이니 trio의 문서를 보고 대응)
# 라이브러리 가져오기
import anyio
# 비동기 함수에는 async를 붙여준다
async def main():
# 비동기 함수 내에서 비동기 함수를 사용할 때에는 await를 붙인다.
await anyio.sleep(1)
# 비동기 함수 내에서 동기 함수를 사용할 때에는 await를 붙이지 않는다.
time.sleep(1)
# 비동기 함수 최종 호출 위치
anyio.run(main)
import anyio
async def task():
print("task")
async def main():
await task()
anyio.run(main)
import random
import time
import anyio
# anyio.sleep을 포함한 task
async def asleep(num):
sleep_time = random.randint(1, 3)
await anyio.sleep(sleep_time)
print(f"asleep {num=} {sleep_time=}")
async def main():
# create_task_group으로 함께 진행할 일들을 설정할 수 있다
# 3명의 고객이 치즈버거, 베토디, 감튀를 시켰다
async with anyio.create_task_group() as tg:
# for 문으로 3번 반복
for n in range(3):
# start_soon을 사용하여 task_group에 task를 넣는다
tg.start_soon(asleep, n)
start = time.time()
anyio.run(main)
end = time.time()
print(f"{end - start:.1f} sec")
# asleep num=2 sleep_time=1
# asleep num=0 sleep_time=2
# asleep num=1 sleep_time=3
# 3.0 sec
# 비동기 작업으로 3초가 걸렸다
import random
import time
import anyio
async def tsleep(num):
sleep_time = random.randint(1, 3)
time.sleep(sleep_time)
print(f"tsleep {num=} {sleep_time=}")
async def main():
async with anyio.create_task_group() as tg:
for n in range(3):
tg.start_soon(tsleep, n)
start = time.time()
anyio.run(main)
end = time.time()
print(f"{end - start:.1f} sec")
# tsleep num=0 sleep_time=2
# tsleep num=1 sleep_time=3
# tsleep num=2 sleep_time=2
# 7.0 sec
# 비동기 작업이 되지 않아서 2 + 3 + 2 = 7초가 걸렸다
import random
import time
import anyio
async def task(num):
sleep_time = random.randint(1, 3)
await anyio.sleep(sleep_time)
print(f"task {num} {sleep_time=}")
async def main():
# await를 붙이면 동기 작업처럼 진행된다.
await task(0)
await task(1)
await task(2)
start = time.time()
anyio.run(main)
end = time.time()
print(f"{end - start:.1f} sec")
# task 0 sleep_time=2
# task 1 sleep_time=3
# task 2 sleep_time=1
# 6.0 sec