파이썬 - 비동기 / anyio

jaybon·2022년 10월 14일
0

파이썬

목록 보기
15/20

라이브러리들

  • asyncio
  • trio
  • anyio

asyncio

파이썬은 동기적인 언어라서 비동기 작업이 어려웠다.
그 아쉬움을 해소하기 위해 채택된 표준 비동기 라이브러리

동기/비동기/직렬/동시 구분하기
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

trio

사용하기 좀 더 쉬워진 비동기 라이브러리.
asyncio와의 호환성이 부족하다.
문서가 잘되어있다.

anyio

사용하기 쉬우면서도 asyncio, trio가 가지고 있는 기능들을 대부분 사용할 수 있다
(문서가 부족한 편이니 trio의 문서를 보고 대응)

anyio 사용

1.처음써보기

# 라이브러리 가져오기
import anyio


# 비동기 함수에는 async를 붙여준다
async def main():
    # 비동기 함수 내에서 비동기 함수를 사용할 때에는 await를 붙인다.
    await anyio.sleep(1)
	# 비동기 함수 내에서 동기 함수를 사용할 때에는 await를 붙이지 않는다.
    time.sleep(1)


# 비동기 함수 최종 호출 위치
anyio.run(main)

2.task 만들기

import anyio


async def task():
    print("task")


async def main():
    await task()


anyio.run(main)

3. anyio.sleep을 포함한 task

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초가 걸렸다

4. time.sleep을 포함한 task

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초가 걸렸다

5. await는 비동기 함수를 동기 작업으로 만든다

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

참고자료

https://velog.io/@kkang/%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%A7%81%EB%A0%AC%ED%81%90%EA%B3%BC-%EB%8F%99%EC%8B%9C%ED%81%90

https://badcandy.github.io/2019/01/14/concurrency-01/

https://phi-friday.github.io/posts/velog/%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C%20%EB%8F%99%EC%8B%9C%EC%84%B1%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%84%20%EC%89%BD%EA%B2%8C%20%ED%95%98%EB%8A%94%EB%B2%95%20-%202

profile
티스토리 블로그 https://ondolroom.tistory.com/

0개의 댓글