마이크로파이썬(MicroPython)으로 센서 제어나 IoT 프로젝트를 진행하다 보면 한 번쯤 막히는 순간이 있습니다. 바로 “여러 작업을 동시에 처리하고 싶을 때”입니다.
기존 방식대로 time.sleep()을 쓰면 제어 장치가 완전히 멈춰버려 다른 센서나 LED가 반응하지 않는 문제가 생기죠. 이 문제를 해결하기 위해 비동기 프로그래밍(uasyncio)을 사용하는데, 개념이 헷갈려 어려워하시는 분들이 많습니다.
오늘은 마이크로파이썬 비동기 코딩의 개념부터 실전 예제, 주의사항까지 한 눈에 이해하기 쉽게 정리해 드립니다!
💡 1. 비동기 프로그래밍이란? (쉽게 이해하는 비유)
비동기 프로그래밍의 핵심은 “대기 시간을 활용해 다른 일을 처리하는 것”입니다.
- 동기식 (기존 방식):냄비에 물을 올려두고, 물이 끓을 때까지 3분 동안 아무것도 안 하고 냄비만 바라봅니다. 물이 끓으면 라면을 넣고, 다 먹은 후에야 비로소 세탁기를 돌리러 갑니다.
- 비동기식 (
uasyncio사용):냄비에 물을 올리고 “물 끓는 대기 시간” 동안 세탁기를 돌리러 갑니다. 물이 끓으면 다시 돌아와서 라면을 넣습니다.
즉, 마이크로컨트롤러(CPU)가 무언가를 기다려야 할 때 놀지 않고 다른 작업을 처리하도록 스케줄표를 짜서 번갈아 가며 실행하는 원리입니다.
🛠️ 2. 비동기 코딩의 3대 핵심 키워드
비동기 코드를 작성할 때 다음 3가지 키워드만 기억하면 됩니다.
async def: “이 함수는 비동기로 작동하며, 중간에 멈췄다 돌아올 수 있다”고 선언합니다.await: “여기서 잠시 기다릴 테니, 기다리는 동안 다른 작업을 처리해라”라고 제어권을 양보합니다.asyncio.gather(): 여러 개의 비동기 함수(작업)를 하나로 묶어 동시에 실행시킵니다.
💻 3. 실전 예제: 주기가 다른 LED 2개 동시 제어하기
가장 흔히 접하는 “두 개의 LED를 서로 다른 주기로 깜빡이기” 예제입니다.
time.sleep()을 쓰면 LED1이 멈춘 동안 LED2도 같이 멈추지만, 비동기를 쓰면 각자 독립적으로 움직입니다.
Python
⚠️ 4. 마이크로파이썬 비동기 개발 시 실수하기 쉬운 3가지!
time.sleep()절대 사용 금지time.sleep()은 보드 전체를 강제로 멈추기 때문에 비동기 환경을 무력화시킵니다. 반드시await asyncio.sleep()을 사용해야 합니다.await누락 주의asyncio.sleep()앞에await키워드를 빠뜨리면 지연 없이 그대로 다음 코드로 넘어가 버립니다.- 무한 루프(
while True) 내부에는 반드시await배치루프 안에서await으로 제어권을 한 번도 양보하지 않으면 타 작업이 실행 기회를 얻지 못해 보드가 멈추거나 다운될 수 있습니다.
📝 마무리 요약
- 대기 시간(센서 데이터 측정 대기, 타이머 지연, 네트워크 통신 등)이 발생할 때
await을 걸어두면 CPU는 그동안 다른 일을 처리합니다. async def로 함수 작성 ➔ 지연 발생 시await asyncio.sleep()➔asyncio.run()으로 실행이라는 패턴만 익혀두면 비동기 프로그래밍도 어렵지 않게 적용할 수 있습니다.
마이크로파이썬 프로젝트에서 여러 센서나 모듈을 동시에 매끄럽게 제어하고 싶다면, 오늘 다룬 비동기 패턴을 꼭 적용해 보세요!
마이크로파이썬(MicroPython)에서 비동기 프로그래밍이 어렵게 느껴지는 이유는 “여러 일을 동시에 진행하는 것처럼 보이게 만드는 원리” 때문입니다.
일반적인 파이썬 코드(동기식)가 일방통행이라면, 비동기 코드는 스케줄표를 짜서 효율적으로 번갈아 가며 작업하는 것과 같습니다.
uasyncio (또는 최신 버전의 asyncio)를 사용한 가장 간단하고 직관적인 실생활 비동기 예제를 소개합니다.
💡 비동기를 쉽게 이해하는 비유: “라면 끓이기와 빨래하기”
- 동기식 (기존 방식): 물이 끓을 때까지 3분 동안 아무것도 안 하고 냄비만 멍하니 바라본 뒤, 물이 끓으면 라면을 넣고, 다 먹은 후에야 세탁기를 돌립니다.
- 비동기식 (uasyncio): 물을 올려두고 “끓는 동안(대기 시간)” 세탁기를 돌리러 갑니다. 물이 끓으면 다시 돌아와서 라면을 넣습니다.
핵심은 “무언가를 기다려야 하는 시간(await asyncio.sleep)”에 CPU가 놀지 않고 다른 일을 하게 만드는 것입니다.
🛠️ 핵심 키워드 3가지
async def: “이 함수는 비동기로 작동하며, 중간에 멈췄다 돌아올 수 있다”고 선언합니다.await: “여기서 잠시 기다릴 테니, 기다리는 동안 다른 일을 처리해라”라고 양보합니다. (time.sleep대신asyncio.sleep을 써야 함!)asyncio.gather: 여러 비동기 함수들을 모아서 동시에 실행시킵니다.
⚠️ 마이크로파이썬 비동기 코딩 시 주의할 점!
time.sleep()을 절대 사용하지 마세요.time.sleep()은 보드 전체를 멈춰버리므로 비동기의 이점이 사라집니다. 반드시await asyncio.sleep()을 사용해야 합니다.
await누락 금지asyncio.sleep()앞에await을 빠뜨리면 기다리지 않고 그냥 넘어가버립니다.
- 무한 루프 안에
await이 최소 하나는 있어야 합니다.while True:안에서await으로 제어권을 양보하지 않으면 다른 작업이 실행될 기회를 얻지 못해 보드가 튕기거나 멈출 수 있습니다.
📌 요약
- 시간이 걸리는 작업(센서 값 대기, 대기 시간, 네트워크 통신)이 있을 때
await을 걸어두면, 보드는 그 시간에 다른 일을 처리합니다. - 일단
async def로 함수 만들기 ➔ 기다릴 땐await asyncio.sleep()쓰기 ➔asyncio.run()으로 실행하기 패턴만 익혀두시면 훨씬 수월해집니다!


답글 남기기
댓글을 달기 위해서는 로그인해야합니다.