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.run(coro: Coroutine) Any¶
주어진 코루틴으로부터 새 태스크를 생성하고 완료될 때까지 실행합니다.
coro가 반환한 값을 반환합니다.
추가 함수¶
- 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 확장 기능입니다.
class Task¶
- class asyncio.Task¶
이 객체는 코루틴을 실행 중인 태스크로 감쌉니다. 태스크는
await task를 사용하여 대기할 수 있으며, 이는 태스크가 완료될 때까지 기다린 후 태스크의 반환값을 반환합니다.태스크는 직접 생성해서는 안 되며, 대신
create_task()를 사용하여 생성해야 합니다.
class Event¶
- class asyncio.Event¶
태스크를 동기화하는 데 사용할 수 있는 새 이벤트를 생성합니다. 이벤트는 클리어된 상태로 시작합니다.
- set() None¶
이벤트를 설정합니다. 해당 이벤트를 대기하던 모든 태스크가 실행되도록 스케줄링됩니다.
참고: 이는 태스크 내부에서 호출해야 합니다. IRQ, 스케줄러 콜백 또는 다른 스레드에서 호출하는 것은 안전하지 않습니다.
ThreadSafeFlag를 참조하세요.
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
다른 스레드, IRQ 또는 스케줄러 콜백과 같이 asyncio 루프 외부에서 실행되는 코드와 태스크를 동기화하는 데 사용할 수 있는 새 플래그를 생성합니다. 플래그는 클리어된 상태로 시작합니다.
class Lock¶
- class asyncio.Lock¶
태스크를 조율하는 데 사용할 수 있는 새 락을 생성합니다. 락은 잠금 해제된 상태로 시작합니다.
아래 메서드 외에도, 락은
async with문에서 사용할 수 있습니다.
TCP 스트림 연결¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
주어진 host와 port로 TCP 연결을 엽니다. host 주소는
socket.getaddrinfo()를 사용하여 확인되며, 이는 현재 블로킹 호출입니다. ssl이ssl.SSLContext객체이면 이 컨텍스트를 사용하여 전송이 생성되고, ssl이True이면 기본 컨텍스트가 사용됩니다.리더 스트림과 라이터 스트림의 쌍을 반환합니다. 호스트를 확인할 수 없거나 연결을 만들 수 없는 경우 소켓 관련
OSError를 발생시킵니다.이것은 코루틴입니다.
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
주어진 host와 port에서 TCP 서버를 시작합니다. 들어오는 수락된 연결에 대해 callback이 호출되며, 해당 연결의 리더 스트림과 라이터 스트림이라는 2개의 인수가 전달됩니다.
ssl이
ssl.SSLContext객체이면 이 컨텍스트를 사용하여 전송이 생성됩니다.Server객체를 반환합니다.이것은 코루틴입니다.
- class asyncio.Stream¶
이것은 TCP 스트림 연결을 나타냅니다. 코드를 최소화하기 위해 이 클래스는 리더와 라이터를 모두 구현하며,
StreamReader와StreamWriter모두 이 클래스의 별칭입니다.- 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예외를 발생시킵니다.이것은 코루틴입니다.
- write(buf: bytes) None¶
buf를 출력 버퍼에 누적합니다. 데이터는
Stream.drain()이 호출될 때만 플러시됩니다. 이 함수를 호출한 직후에Stream.drain()을 호출하는 것이 권장됩니다.
이벤트 루프¶
- asyncio.new_event_loop() Loop¶
이벤트 루프를 리셋하고 반환합니다.
참고: MicroPython에는 단일 이벤트 루프만 있으므로 이 함수는 루프의 상태를 리셋할 뿐이며, 새 루프를 생성하지 않습니다.
- class asyncio.Loop¶
이것은 태스크를 스케줄링하고 실행하는 객체를 나타냅니다. 직접 생성할 수 없으며, 대신
get_event_loop()를 사용하세요.- run_until_complete(awaitable: Awaitable) Any¶
주어진 awaitable이 완료될 때까지 실행합니다. awaitable이 태스크가 아닌 경우 태스크로 승격됩니다.
- set_exception_handler(handler: Callable) None¶
태스크가 잡히지 않은 예외를 발생시킬 때 호출할 예외 핸들러를 설정합니다. handler는
(loop, context)라는 두 개의 인수를 받아야 합니다.