asyncio — 비동기 I/O 스케줄러

이 모듈은 async/await 코루틴을 위한 협력적 멀티태스킹 스케줄러와 함께 동기화 기본 요소(락, 이벤트) 및 스트림 리더와 라이터를 통한 논블로킹 TCP 네트워킹 기능을 제공합니다. 태스크는 단일 이벤트 루프에서 동시에 실행되며, 현재 실행 중인 태스크는 await로 제어권을 루프에 다시 양보합니다.

예제:

import asyncio

async def blink(led, period_ms):
    while True:
        led.on()
        await asyncio.sleep_ms(5)
        led.off()
        await asyncio.sleep_ms(period_ms)

async def main(led1, led2):
    asyncio.create_task(blink(led1, 700))
    asyncio.create_task(blink(led2, 400))
    await asyncio.sleep_ms(10_000)

# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))

핵심 함수

asyncio.create_task(coro: Coroutine) Task

주어진 코루틴으로부터 새 태스크를 생성하고 실행되도록 스케줄링합니다.

해당하는 Task 객체를 반환합니다.

asyncio.current_task() Task

현재 실행 중인 태스크와 연결된 Task 객체를 반환합니다.

asyncio.run(coro: Coroutine) Any

주어진 코루틴으로부터 새 태스크를 생성하고 완료될 때까지 실행합니다.

coro가 반환한 값을 반환합니다.

asyncio.sleep(t: float) None

t초 동안 대기합니다(부동소수점일 수 있습니다).

이것은 코루틴입니다.

asyncio.sleep_ms(t: int) None

t밀리초 동안 대기합니다.

이것은 코루틴이며, MicroPython 확장 기능입니다.

추가 함수

asyncio.wait_for(awaitable: Awaitable, timeout: float) Any

awaitable이 완료될 때까지 대기하되, timeout초보다 오래 걸리면 취소합니다. awaitable이 태스크가 아닌 경우 이로부터 태스크가 생성됩니다.

타임아웃이 발생하면 태스크를 취소하고 asyncio.TimeoutError를 발생시킵니다. 이는 호출자가 처리해야 합니다. 태스크는 asyncio.CancelledError를 받게 되는데, 이는 무시하거나 try...except 또는 try...finally로 처리하여 정리 코드를 실행할 수 있습니다.

awaitable의 반환값을 반환합니다.

이것은 코루틴입니다.

asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any

wait_for()와 유사하지만 timeout이 밀리초 단위의 정수입니다.

이것은 코루틴이며, MicroPython 확장 기능입니다.

asyncio.gather(*awaitables, return_exceptions: bool = False) List

모든 awaitables를 동시에 실행합니다. 태스크가 아닌 awaitables는 태스크로 승격됩니다.

모든 awaitables의 반환값으로 이루어진 리스트를 반환합니다.

이것은 코루틴입니다.

class Task

class asyncio.Task

이 객체는 코루틴을 실행 중인 태스크로 감쌉니다. 태스크는 await task를 사용하여 대기할 수 있으며, 이는 태스크가 완료될 때까지 기다린 후 태스크의 반환값을 반환합니다.

태스크는 직접 생성해서는 안 되며, 대신 create_task()를 사용하여 생성해야 합니다.

cancel() None

asyncio.CancelledError를 주입하여 태스크를 취소합니다. 태스크는 이 예외를 무시할 수 있습니다. 이를 처리하거나 try ... finally를 통해 정리 코드를 실행할 수 있습니다.

class Event

class asyncio.Event

태스크를 동기화하는 데 사용할 수 있는 새 이벤트를 생성합니다. 이벤트는 클리어된 상태로 시작합니다.

is_set() bool

이벤트가 설정되어 있으면 True를, 그렇지 않으면 False를 반환합니다.

set() None

이벤트를 설정합니다. 해당 이벤트를 대기하던 모든 태스크가 실행되도록 스케줄링됩니다.

참고: 이는 태스크 내부에서 호출해야 합니다. IRQ, 스케줄러 콜백 또는 다른 스레드에서 호출하는 것은 안전하지 않습니다. ThreadSafeFlag를 참조하세요.

clear() None

이벤트를 클리어합니다.

wait() None

이벤트가 설정될 때까지 대기합니다. 이벤트가 이미 설정되어 있으면 즉시 반환됩니다.

이것은 코루틴입니다.

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

다른 스레드, IRQ 또는 스케줄러 콜백과 같이 asyncio 루프 외부에서 실행되는 코드와 태스크를 동기화하는 데 사용할 수 있는 새 플래그를 생성합니다. 플래그는 클리어된 상태로 시작합니다.

set() None

플래그를 설정합니다. 플래그를 대기 중인 태스크가 있으면 실행되도록 스케줄링됩니다.

clear() None

플래그를 클리어합니다. 이는 대기하기 전에 이전에 설정되었을 수 있는 플래그가 확실히 클리어되도록 하는 데 사용할 수 있습니다.

wait() None

플래그가 설정될 때까지 대기합니다. 플래그가 이미 설정되어 있으면 즉시 반환됩니다. wait에서 반환될 때 플래그는 자동으로 리셋됩니다.

플래그는 한 번에 하나의 태스크만 대기할 수 있습니다.

이것은 코루틴입니다.

class Lock

class asyncio.Lock

태스크를 조율하는 데 사용할 수 있는 새 락을 생성합니다. 락은 잠금 해제된 상태로 시작합니다.

아래 메서드 외에도, 락은 async with 문에서 사용할 수 있습니다.

locked() bool

락이 잠겨 있으면 True를, 그렇지 않으면 False를 반환합니다.

acquire() bool

락이 잠금 해제된 상태가 될 때까지 대기한 다음 원자적으로 잠급니다. 한 번에 하나의 태스크만 락을 획득할 수 있습니다.

이것은 코루틴입니다.

release() None

락을 해제합니다. 락을 대기 중인 태스크가 있으면 큐에서 다음 태스크가 실행되도록 스케줄링되고 락은 잠긴 상태로 유지됩니다. 그렇지 않으면 대기 중인 태스크가 없으므로 락이 잠금 해제됩니다.

TCP 스트림 연결

asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]

주어진 hostport로 TCP 연결을 엽니다. host 주소는 socket.getaddrinfo()를 사용하여 확인되며, 이는 현재 블로킹 호출입니다. sslssl.SSLContext 객체이면 이 컨텍스트를 사용하여 전송이 생성되고, sslTrue이면 기본 컨텍스트가 사용됩니다.

리더 스트림과 라이터 스트림의 쌍을 반환합니다. 호스트를 확인할 수 없거나 연결을 만들 수 없는 경우 소켓 관련 OSError를 발생시킵니다.

이것은 코루틴입니다.

asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server

주어진 hostport에서 TCP 서버를 시작합니다. 들어오는 수락된 연결에 대해 callback이 호출되며, 해당 연결의 리더 스트림과 라이터 스트림이라는 2개의 인수가 전달됩니다.

sslssl.SSLContext 객체이면 이 컨텍스트를 사용하여 전송이 생성됩니다.

Server 객체를 반환합니다.

이것은 코루틴입니다.

class asyncio.Stream

이것은 TCP 스트림 연결을 나타냅니다. 코드를 최소화하기 위해 이 클래스는 리더와 라이터를 모두 구현하며, StreamReaderStreamWriter 모두 이 클래스의 별칭입니다.

get_extra_info(v: str) Any

v로 지정된 스트림에 대한 추가 정보를 가져옵니다. v에 유효한 값은 peername입니다.

close() None

스트림을 닫습니다.

wait_closed() None

스트림이 닫힐 때까지 대기합니다.

이것은 코루틴입니다.

read(n: int = -1) bytes

최대 n 바이트를 읽어 반환합니다. n이 제공되지 않거나 -1이면 EOF까지 모든 바이트를 읽습니다. 바이트를 읽기 전에 EOF를 만나면 반환값은 빈 bytes 객체가 됩니다.

이것은 코루틴입니다.

readinto(buf: bytearray | memoryview) int

최대 n 바이트를 buf로 읽어 들이며, n은 buf의 길이와 같습니다.

buf로 읽어 들인 바이트 수를 반환합니다.

이것은 코루틴이며, MicroPython 확장 기능입니다.

readexactly(n: int) bytes

정확히 n 바이트를 읽어 bytes 객체로 반환합니다.

n 바이트를 읽기 전에 스트림이 끝나면 EOFError 예외를 발생시킵니다.

이것은 코루틴입니다.

readline() bytes

한 줄을 읽어 반환합니다.

이것은 코루틴입니다.

write(buf: bytes) None

buf를 출력 버퍼에 누적합니다. 데이터는 Stream.drain()이 호출될 때만 플러시됩니다. 이 함수를 호출한 직후에 Stream.drain()을 호출하는 것이 권장됩니다.

drain() None

버퍼링된 모든 출력 데이터를 스트림으로 내보냅니다(쓰기).

이것은 코루틴입니다.

class asyncio.Server

이것은 start_server()에서 반환된 서버 클래스를 나타냅니다. async with 문에서 사용하여 종료 시 서버를 닫을 수 있습니다.

close() None

서버를 닫습니다.

wait_closed() None

서버가 닫힐 때까지 대기합니다.

이것은 코루틴입니다.

이벤트 루프

asyncio.get_event_loop() Loop

태스크를 스케줄링하고 실행하는 데 사용되는 이벤트 루프를 반환합니다. Loop를 참조하세요.

asyncio.new_event_loop() Loop

이벤트 루프를 리셋하고 반환합니다.

참고: MicroPython에는 단일 이벤트 루프만 있으므로 이 함수는 루프의 상태를 리셋할 뿐이며, 새 루프를 생성하지 않습니다.

class asyncio.Loop

이것은 태스크를 스케줄링하고 실행하는 객체를 나타냅니다. 직접 생성할 수 없으며, 대신 get_event_loop()를 사용하세요.

create_task(coro: Coroutine) Task

주어진 coro로부터 태스크를 생성하고 새 Task 객체를 반환합니다.

run_forever() None

stop()이 호출될 때까지 이벤트 루프를 실행합니다.

run_until_complete(awaitable: Awaitable) Any

주어진 awaitable이 완료될 때까지 실행합니다. awaitable이 태스크가 아닌 경우 태스크로 승격됩니다.

stop() None

이벤트 루프를 중지합니다.

close() None

이벤트 루프를 닫습니다.

set_exception_handler(handler: Callable) None

태스크가 잡히지 않은 예외를 발생시킬 때 호출할 예외 핸들러를 설정합니다. handler(loop, context)라는 두 개의 인수를 받아야 합니다.

get_exception_handler() Callable | None

현재 예외 핸들러를 가져옵니다. 핸들러를 반환하거나, 사용자 정의 핸들러가 설정되지 않은 경우 None을 반환합니다.

default_exception_handler(context: dict) None

호출되는 기본 예외 핸들러입니다.

call_exception_handler(context: dict) None

현재 예외 핸들러를 호출합니다. 인수 context는 그대로 전달되며, 'message', 'exception', 'future' 키를 포함하는 딕셔너리입니다.