kangchanguk / study

0 stars 0 forks source link

python asyncio #11

Open kangchanguk opened 4 months ago

kangchanguk commented 4 months ago

python asyncio

sample

import asyncio
from random import randint
from datetime import datetime

async def run_job() -> None:
    delay = randint(5, 15)
    print(f"{datetime.now()} start")
    await asyncio.sleep(delay)
    print(f"{datetime.now()} finished ({delay} sec)")

async def main() -> None:
    while True:
        #await run_job()
        asyncio.create_task(run_job())
        await asyncio.sleep(10)

asyncio.run(main())

await run_job()

ayncio.create_task

without await(only run_job)

Awaitable, coroutine, Future

스크린샷 2024-05-25 오후 3 15 35

await 키워드를 붙일 수 있는 최소 조건이 Awaitable

코루틴은 Eventloop에 등록되지 않으면 실행되지 않기 때문에 await를 붙이거나 Future나 Task로 감싸야함

동시 실행

Eventloop가 코루틴들을 처리하는 방식을 이해해보자!!!

await 키워드가 실행될 때 실행권을 Eventloop에 넘기면 해당 코루틴이 suspend 되면서 다른 코루틴을 마저 실행함

Eventoop는 비선점형이기 때문에 실행중인 코루틴이 await를 사용하거나 return을 해서 실행권을 eventloop에 돌려주지 않는 다면 실행권을 뺏어서 다른 코루틴을 실행할 방법이 없음

=> requests 같은 blocking 코드를 코루틴 내부에서 실행하지 못하는 이유