Powerlevel10k 中的异步工作进程允许提示段在后台进程中执行潜在的慢操作,而不会阻塞主 shell。这是一个关键的性能特性,有助于在显示需要耗时操作(如 Git 状态检查)的信息时保持 shell 的响应能力。
有关提示引擎如何使用此系统的信息,请参阅 提示引擎。有关 Git 集成的具体详细信息,请参阅 Git 集成。
工作进程由主 shell 进程和一个独立的辅助进程组成,它们通过一对文件描述符进行通信。主 shell 向辅助进程发送请求,辅助进程异步执行这些请求,并在准备就绪时将结果发送回主 shell。
工作进程使用简单的基于文本的协议,并使用特殊分隔符在进程之间进行通信。消息以 0x1E 字符(记录分隔符)终止,消息中的字段则使用 0x1F 字符(单元分隔符)分隔。
来源: internal/worker.zsh15-17 internal/worker.zsh79-89 internal/worker.zsh115-177
工作进程主进程(_p9k_worker_main)创建一个用于通信的 FIFO,向主 shell 发出就绪信号,然后进入一个处理传入请求的循环。它维护一组用于正在进行的异步操作的文件描述符,并处理其完成时的结果。
工作进程使用 _p9k_worker_async 函数异步执行任务。此函数创建一个子 shell 来执行指定的命令并捕获其输出。命令完成后,结果将被发送回主 shell。
| 功能 | 目的 |
|---|---|
_p9k_worker_async | 在工作进程中异步执行命令 |
_p9k_worker_reply | 将结果发送回主 shell |
_p9k_worker_invoke | 将请求从主 shell 发送到工作进程 |
_p9k_worker_receive | 在主 shell 中处理来自工作进程的响应 |
主 shell 通过几个函数与工作进程交互
_p9k_worker_start:初始化工作进程系统_p9k_worker_stop:终止工作进程系统_p9k_worker_invoke:向工作进程发送请求_p9k_worker_receive:处理来自工作进程的响应主 shell 使用 ZLE(Zsh 行编辑器)回调来接收和处理来自工作进程的响应,而不会阻塞 shell。
工作进程系统在 Powerlevel10k 初始化时启动。_p9k_worker_start 函数创建一个临时文件前缀,打开一个用于接收响应的文件描述符,并使用进程替换来启动工作进程。
来源: internal/worker.zsh180-219
当 shell 退出或发生错误时,工作进程系统会被停止。_p9k_worker_stop 函数会关闭文件描述符,终止工作进程,并删除临时文件。
当提示段需要执行潜在的慢操作时,它可以利用工作进程系统异步执行该操作。通常的过程如下:
来源: internal/worker.zsh79-89 internal/worker.zsh115-177
异步工作进程系统提供了多种性能优势
该系统对于 Git 状态提示段尤其重要,它需要查询 Git 仓库状态,这可能是一个耗时操作,具体取决于仓库的大小。
来源: internal/worker.zsh147-173
工作进程使用 zselect 来有效地等待多个文件描述符上的输入。当一个文件描述符就绪时,它会读取输入并根据协议进行处理。
工作进程系统包含健壮的错误处理机制,以防止在工作进程失败时主 shell 崩溃。如果工作进程通信的任何步骤失败,系统将自动停止并清理工作进程。
来源: internal/worker.zsh27-76 internal/worker.zsh175-177
工作进程系统使用几种消息类型
| 消息类型 | 格式 | 目的 |
|---|---|---|
| 请求 | <ID>\x1F<命令>\x1E | 主 shell 向工作进程发送命令 |
| 数据回复 | e<数据>\x1E | 工作进程将结果发送回主 shell |
| 完成回复 | d<ID>\x1E | 工作进程指示请求已完成 |
| 启动信号 | s<pgid>\x1E | 工作进程发出信号表示已准备好接收请求 |
来源: internal/worker.zsh1-76 internal/worker.zsh79-89 internal/worker.zsh115-177
异步工作进程系统主要由需要执行潜在慢操作的提示段使用。提示引擎调用 _p9k_worker_invoke 提交请求,并通过 ZLE 回调机制接收结果。当结果到达时,提示引擎会刷新显示以显示更新的信息。