Open kangchanguk opened 4 months ago
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())
파라미터로 들어오는 코루틴을 Eventloop에 등록하고 코루틴이 끝났을 때 결과를 받아볼 수 있는 Future 객체를 반환
Futere 역시 Awaitable 객체이기에 await를 앞에 붙이면 Eventloop에 실행권을 넘기면서 코루틴의 종료까지 기다릴 수 있음
await 없이 넘어감으로써 실행권을 뺏기지 않은 채로 while iteration을 위해 10초간 기다림
await 키워드를 붙일 수 있는 최소 조건이 Awaitable
코루틴은 Eventloop에 등록되지 않으면 실행되지 않기 때문에 await를 붙이거나 Future나 Task로 감싸야함
Eventloop가 코루틴들을 처리하는 방식을 이해해보자!!!
await 키워드가 실행될 때 실행권을 Eventloop에 넘기면 해당 코루틴이 suspend 되면서 다른 코루틴을 마저 실행함
Eventoop는 비선점형이기 때문에 실행중인 코루틴이 await를 사용하거나 return을 해서 실행권을 eventloop에 돌려주지 않는 다면 실행권을 뺏어서 다른 코루틴을 실행할 방법이 없음
=> requests 같은 blocking 코드를 코루틴 내부에서 실행하지 못하는 이유
python asyncio
sample
await run_job()
ayncio.create_task
파라미터로 들어오는 코루틴을 Eventloop에 등록하고 코루틴이 끝났을 때 결과를 받아볼 수 있는 Future 객체를 반환
Futere 역시 Awaitable 객체이기에 await를 앞에 붙이면 Eventloop에 실행권을 넘기면서 코루틴의 종료까지 기다릴 수 있음
await 없이 넘어감으로써 실행권을 뺏기지 않은 채로 while iteration을 위해 10초간 기다림
without await(only run_job)
Awaitable, coroutine, Future
await 키워드를 붙일 수 있는 최소 조건이 Awaitable
코루틴은 Eventloop에 등록되지 않으면 실행되지 않기 때문에 await를 붙이거나 Future나 Task로 감싸야함
동시 실행
Eventloop가 코루틴들을 처리하는 방식을 이해해보자!!!
await 키워드가 실행될 때 실행권을 Eventloop에 넘기면 해당 코루틴이 suspend 되면서 다른 코루틴을 마저 실행함
Eventoop는 비선점형이기 때문에 실행중인 코루틴이 await를 사용하거나 return을 해서 실행권을 eventloop에 돌려주지 않는 다면 실행권을 뺏어서 다른 코루틴을 실행할 방법이 없음
=> requests 같은 blocking 코드를 코루틴 내부에서 실행하지 못하는 이유