Python 如何使用Fabric在远程主机上并行发出命令而不使用fabfile?

Python 如何使用Fabric在远程主机上并行发出命令而不使用fabfile?,python,parallel-processing,fabric,Python,Parallel Processing,Fabric,我有一个Python脚本,它使用Fabric在远程主机上启动测试,获取测试的otuput文件,并进行一些解析。Python脚本不是一个文件 我想同时启动和运行这些测试。我读过关于使用“@parallel”装饰器的内容,但我读过的所有示例都将脚本作为一个文件 我的代码是这样的: from fabric.api import * # Copy the testfile on each of the hosts. This is sequential, it could be # done in

我有一个Python脚本,它使用Fabric在远程主机上启动测试,获取测试的otuput文件,并进行一些解析。Python脚本不是一个文件

我想同时启动和运行这些测试。我读过关于使用“@parallel”装饰器的内容,但我读过的所有示例都将脚本作为一个文件

我的代码是这样的:

from fabric.api import *

# Copy the testfile on each of the hosts.  This is sequential, it could be
# done in parallel but doing it in parallel is not that important
def copy_test(host_list, testfile_name):
    for x in host_list:
        env['host_string'] = x

        target_testfile_name = "/tmp/" + testfile_name

        put(testfile_name, target_testfile_name)


@parallel  # Would this decorator work?
def run_test(host_list, testfile_name):

    target_testfile_name = "/tmp/" + testfile_name
    for x in host_list:
        env['host_string'] = x
        run(target_testfile_name)


if __name__ == '__main__':

    HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13']

    testfile_name = "foo.py"

    copy_test(HOSTS, testfile_name)

    # I would like to launch run_test() in parallel
    run_test(HOSTS, testfile_name)        
这是代码的简化版本。我没有包括所有内容,但我传递了主机的配置信息,因此限制了我将此脚本作为一个文件来使用,其中我发布了如下内容:

“fab-H'10.10.10.10'复制测试”

“fab-H'10.10.10.10'运行测试”-p

我可以使用threading.Threads库执行run_test(),但我宁愿这样做作为最后的手段

正如你所看到的,我并不是把它当作一个文件来运行的


是否有一种方法可以使用Fabric的并行执行模型执行run_test(),而不将脚本作为“fabfile”执行?

我无法评论,因此我将把答案更改为:

if __name__ == '__main__':

    HOSTS = ['10.10.10.10', '10.10.10.11', '10.10.10.12', '10.10.10.13']

    testfile_name = "foo.py"

    execute(copy_test,HOSTS, testfile_name)

    # I would like to launch run_test() in parallel
    execute(run_test,HOSTS, testfile_name)     

如果您使用
execute()
调用函数,并且您的函数具有
@parallel
它将以并行方式启动

还有一件事,您知道结构的环境变量吗?因为您可以将主机列表存储在
env.hosts
中,这样就不必将它们作为argumentspwnsauce传递,谢谢您的建议。我会试试看是否能解决我的问题。