如何限制pre-commit运行pre-push钩子时的CPU占用上限
问题原因
- 当前配置中flake8被指定全量扫描
server/apps/目录下所有Python文件,而非仅扫描本次推送涉及的改动文件,仓库文件量较大时,flake8会构建全量文件的抽象语法树做规则校验,计算量本身就很高。 - flake8默认会启动和机器CPU逻辑核心数相等的工作进程并行执行扫描任务,没有做并发限制的情况下,会直接占满所有可用CPU资源。
- 现有配置未显式指定钩子运行阶段为
pre-push,钩子会默认在pre-commit、pre-push等多个阶段重复触发,重复执行扫描任务会进一步拉高CPU占用。
配置CPU最高使用阈值的方法
- 方法1:直接限制flake8的并行进程数,精准控制CPU占用核心数
flake8提供-j/--jobs参数用于指定并行工作进程数,数值即为允许占用的最大CPU核心数,修改配置即可生效,参考配置如下:
repos: - repo: local hooks: - id: flake8 name: flake8 description: linter # 示例中-j 2代表最多占用2个CPU核心,可根据自身需求调整数值,不要超过机器总逻辑核心数即可 entry: flake8 -j 2 --select=C812,WPS120,F401,WPS510 --config=setup.cfg server/apps/ language: python types: [python] stages: [pre-push] # 显式指定仅在pre-push阶段运行,避免重复执行
- 方法2:缩小扫描范围,减少计算量
去掉entry中硬编码的server/apps/全量路径,让pre-commit仅把本次推送涉及的改动Python文件传给flake8扫描,文件量减少后CPU占用会大幅降低,参考配置如下:
repos: - repo: local hooks: - id: flake8 name: flake8 description: linter entry: flake8 -j 2 --select=C812,WPS120,F401,WPS510 --config=setup.cfg language: python types: [python] stages: [pre-push] pass_filenames: true
- 方法3:全局限制pre-commit的并发数
如果需要对所有pre-commit钩子做统一CPU限制,可在终端配置文件(.bashrc/.zshrc等)中添加环境变量,限制pre-commit全局最大并发进程数:
# 示例为限制全局最多同时运行2个钩子进程,可按需调整数值 export PRE_COMMIT_CONCURRENCY=2
补充说明:如果使用了wemake-python-styleguide(即配置中的WPS开头规则),其本身单文件校验的计算量就高于普通flake8规则,建议优先搭配方法2的增量扫描模式使用,能在保证校验效果的前提下把CPU占用控制在合理范围。
内容的提问来源于stack exchange,提问作者Vadim Beglov
相关产品推荐
相关产品推荐

