핵심 요약
- Neovim 공식 문서에 이벤트 루프를 블로킹하지 않고 비동기 작업을 처리하는 'vim.async' 모듈이 공개되었습니다.
- 코루틴 기반 태스크 관리와 부모-자식 태스크 스코프, 협동형 스케줄링 및 에러 전파 기능을 기본 지원합니다.
- 세마포어(semaphore)를 통한 동시성 제어와 타임아웃, 순차 대기 등 다양한 비동기 조율 유틸리티가 함께 제공됩니다.
요약 Neovim 공식 문서에 루아(Lua) 코드를 위한 구조화된 비동기 처리 API인 `vim.async` 모듈이 새롭게 소개되었습니다. 이번 모듈은 Neovim 내부의 이벤트 루프를 차단(blocking)하지 않고 타이머나 파일 I/O, 콜백 작업 등을 자연스럽게 기다릴 수 있도록 돕는 코루틴 기반 프레임워크입니다.
문서에 따르면 비동기 작업은 `vim.async.run()`을 통해 생성되는 '태스크(Task)' 내부에서 실행됩니다. 태스크 안에서는 `vim.async.await()`를 사용해 콜백 기반 API나 다른 비동기 작업의 완료를 대기할 수 있으며, 오류가 발생할 수 있는 작업에 대비해 pcall과 유사한 `vim.async.pawait()`도 제공됩니다. 이 과정에서 태스크가 대기 상태에 들어가면 루아 스택을 보존한 채 이벤트 루프로 제어권을 즉시 반환하는 협동형(cooperative) 스케줄링 방식을 따릅니다.
특히 이번 API는 태스크 계층 구조와 수명 주기 관리를 체계적으로 지원하는 것이 특징입니다. 한 태스크 실행 도중 생성된 하위 태스크는 자동으로 부모에게 귀속되며, 부모 태스크는 하위 태스크들이 모두 완료될 때까지 기다립니다. 만약 하위 태스크에서 예외가 발생하면 부모 태스크 역시 실패 처리되면서 다른 자식 태스크들까지 닫히도록 설계되었습니다. 백그라운드에서 독립적으로 계속 실행되어야 하는 작업의 경우 `Task:detach()`를 호출해 최상위 작업으로 분리할 수 있습니다.
이외에도 동시 실행 작업 수를 제한할 수 있는 세마포어(`vim.async.semaphore`), 여러 태스크 중 먼저 완료된 순서대로 핸들을 반환받는 `vim.async.iter()`, 특정 시간 제한을 두는 `vim.async.timeout()` 등 실무에 유용한 다양한 비동기 조율 도구들이 함께 포함되었습니다.
Sponsored · 광고