8. Asyncio¶
지금까지 튜토리얼의 모든 스크립트는 순차적이었습니다 – 한 번에 한 줄씩 실행되며, 대기해야 하는 호출(센서 읽기, 네트워크 왕복, 스냅샷)은 완료될 때까지 스크립트를 차단합니다. 이는 할 일이 하나뿐일 때는 잘 동작합니다. 하지만 애플리케이션이 여러 가지를 동시에 해야 하는 순간 – 스냅샷 루프를 실행하는 동시에 시리얼 명령에 응답하고, 또한 네트워크로 프레임을 업로드하는 등 – 순차적 스크립트는 무너집니다. 첫 번째 느린 호출이 나머지 모든 것의 진행을 멈춥니다.
asyncio 모듈은 MicroPython의 해답입니다. 이를 통해 애플리케이션은 여러 작업을 별도의 코루틴으로 기술하고, 단일 스레드에서 협력적으로 동시 실행할 수 있습니다 – 현재 실행 중인 코루틴은 대기해야 할 때마다 스케줄러에 제어권을 양보합니다. 스냅샷 루프, UART 리더, 네트워크 클라이언트가 모두 같은 스크립트에 공존할 수 있으며 한 작업의 느린 부분이 더 이상 다른 작업을 멈추지 않습니다.
앞으로의 페이지들에서는 async/await 키워드와 Task 생명 주기, gather() 및 wait_for()를 통한 조율, 취소 및 예외 전파, 세 가지 내장 동기화 프리미티브(Event, Lock, ThreadSafeFlag), 애플리케이션 클래스를 asyncio 관용구에 연결하는 언어 후크, snapshot()을 코루틴으로 실행할 수 있게 하는 작은 CSI 래퍼, 그리고 협력적 스케줄링에 따라오는 흔한 함정들을 다룹니다.
동기화 프리미티브
사용자 정의 비동기 객체
루프 제어
프레임 캡처
함정
마무리