如何在fabric中并行执行多个任务

7 投票
2 回答
5350 浏览
提问于 2025-04-18 00:10

我知道通过使用 -P 选项或者 @parallel 标签,我可以在多个主机上同时运行任务。

我想在同一台主机上同时执行多个耗时较长的任务:

@task
def task1():
  # long running op

@task
def task2():
  #long running op

@task
def task3():
  #long running op

@task
def backup_all():
  execute(task1)
  execute(task2)
  execute(task3)

我该如何使用 fabric 在同一台主机上同时启动 task1、task2 和 task3 呢?我知道可以运行多个 fab 进程来处理不同的任务,但我希望找到一个涉及 fabric 的解决方案。

2 个回答

2

fabric 是一个工具,它在每台主机上只执行一个任务。使用 -P 这个选项可以让任务在不同的主机上同时运行,但在同一台主机上是不能同时执行多个任务的。

如果你想手动让命令并行执行,可以使用 xargs -P 或者 GNU parallel 这样的工具。

Invoke (测试版) 号称可以让任务并行执行。它从 fabric 中提取出不需要使用 ssh 的部分。如果在远程主机上安装了它,你就可以用 fabric 来调用 invoke 命令,这样就能在同一台主机上并行运行任务。

2

你有很多方法可以解决这个问题。你可以使用bash或linux的任务控制功能,把任务放到后台运行,使用bg命令,然后用wait命令等它们完成。这里有文档解释这种控制机制

如果你还是想用Fabric/Python来做这个事情,你可能需要使用库里已经有的job_queue,然后自己写一个队列把任务放进去,或者了解一下多进程,用简单的python代码来实现任务分叉。其实job_queue就是在做这些事情。

撰写回答