오늘은 동기·비동기 프로그래밍 수업을 짧게 진행했다. 윗층 공사 소음이 심해서 수업을 길게 이어가지는 못했고, 이후에는 중간 팀프로젝트의 주제를 좁히고 개발 흐름과 기획을 구상하는 시간을 가졌다.
수업에서는 프로그램·프로세스·스레드 개념을 정리하고, asyncio 예제로 대기 방식에 따른 실행 순서를 비교했다.
첫 번째 예제는 async def로 정의한 함수 안에서 time.sleep()을 사용했다.
async def fetch_data(name, delay):
print(f"{name} 요청 시작!")
time.sleep(delay)
print(f"{name} 요청 종료!")
return f"{name} 데이터"
이 함수를 asyncio.gather()로 A, B, C 세 개 실행했지만, 출력은 A가 끝난 뒤 B, B가 끝난 뒤 C가 시작되는 순서였다.
A 시작 → A 종료 → B 시작 → B 종료 → C 시작 → C 종료
함수에 async를 붙였어도 내부의 time.sleep()이 실행 흐름을 막고 있었다.
두 번째 예제에서는 대기 부분을 await asyncio.sleep()으로 바꿨다. 아래는 수업 코드에서 출력 문구만 간단히 정리한 내용이다.
async def fetch_data(name, delay):
print(f"{name} 시작")
await asyncio.sleep(delay)
print(f"{name} 종료")
return f"{name} 데이터"
async def main():
await asyncio.gather(
fetch_data("A", 3),
fetch_data("B", 1),
fetch_data("C", 5)
)
await main()
이번에는 A, B, C가 먼저 시작되고, 대기 시간이 짧은 B부터 끝났다. 노트북에 남은 출력 순서도 달랐다.
A 시작 → B 시작 → C 시작 → B 종료 → A 종료 → C 종료
await asyncio.sleep()으로 기다리는 동안 다른 작업이 진행될 수 있었다. 오늘 예제는 실제 네트워크 요청 대신 대기 시간을 넣어 실행 흐름을 비교한 코드다.
이후에는 팀원들과 중간 프로젝트 주제를 좁혔다. 어떤 방향으로 개발을 진행할지 흐름을 정리하고, 기획도 함께 구상했다.
오늘은 주제와 진행 방향을 논의한 단계다. 구체적인 기능이나 구현 내용은 더 정리되는 대로 기록하려고 한다.
짧은 실습이었지만 async def를 쓰는 것만으로 작업이 알아서 번갈아 진행되는 건 아니라는 점을 확인했다. 함수 안에서 어떤 방식으로 기다리는지에 따라 출력 순서가 달라졌다.