Neovim 内置的 Lua 异步 API vim.async:等待而不阻塞事件循环
来源: neovim.io — 2026-09-04
概述
Neovim 官方 help 文档新增的一篇,介绍内置的结构化异步 API vim.async:它让 Lua 代码可以在等待定时器、回调和其它异步任务的同时,不阻塞 Nvim 的事件循环。异步工作运行在「任务(task)」里,任务可在检查点暂停、并在运行期间管理它所创建的子任务。用 vim.async.run() 启动异步工作,在任务内部用 vim.async.await() 等待回调式 API 或其它任务,用 pawait() 处理可能失败且当前任务应继续的等待。调度是协作式的:任务 await 定时器、I/O、回调或另一任务时,vim.async 会保存 Lua 栈并把控制权交还事件循环,让其它回调得以运行;同步 Lua 代码的栈帧永远不会被中途打断。子任务失败若未处理会连坐父任务,也可用 Task:detach() 让后台工作脱离父任务继续运行。
核心要点
- vim.async 让 Lua 代码等待定时器、回调和异步任务时,不阻塞 Nvim 的事件循环
- 异步工作在「任务」中运行,可在检查点暂停并管理运行期间派生的子任务
- vim.async.run() 启动、await() 等待回调式 API、pawait() 用于可失败且应继续的等待
- 协作式调度:任务暂停时保存 Lua 栈并把控制权还给事件循环,同步代码栈帧永不被中断
- 父任务要等子任务完成,子任务失败未处理会连坐父任务,也可 Task:detach() 让后台工作独立存活
金句
vim.async lets Lua code wait for timers, callbacks, and other tasks without blocking Nvim's event loop.(vim.async 让 Lua 代码在等待定时器、回调与其它任务时不阻塞 Nvim 的事件循环。)
👍 0
👎 0
返回 Lobsters 首页