如何在fabric中并行执行多个任务
我知道通过使用 -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
就是在做这些事情。