在for循环上使用并行处理

时间:2017-05-02 17:12:51

标签: python

我编写了一个脚本,用于从文件中读取服务器名称,从其他文件中读取命令名称,并在所有服务器上运行所有命令并打印输出。

import os, paramiko
cmdlist =[]

with open('command.txt') as f:
    for line in f:
        cmdlist.append(line.rstrip())

with open('server.txt') as f:
    for line in f:
        server = line.rstrip()
        username, password = ('root', 'password')
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()
        ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
        ssh.connect(server, username=username, timeout=60)
        print "For Server " + server
        for y in cmdlist:
            ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(y)
            output1 = ssh_stdout.read()
            print ">", output1.rstrip()
        ssh.close() 

问题是循环的第二个顺序运行,因此需要花费太多时间。服务器的顺序并不重要。我希望我的脚本在所有服务器上并行运行命令,然后在文件中编译。

我试过这样的事情。我将上面的代码放在一个名为" fast_process"的函数中。并编写如下代码:

if __name__ == '__main__':
    pool = Pool()                         
    pool.map(fast_process)

但这似乎是问我更多的论点,但我的功能不会引起任何争论。我该怎么办?

1 个答案:

答案 0 :(得分:1)

map是一个函数,它接受一个函数,一个序列并将一个函数应用于一个序列的每个元素(简化一个python版本的map)

所以你需要的是创建一系列服务器并将功能应用于它们。

import os, paramiko

with open('command.txt') as f:
    commands = tuple(line.rstrip() for line in f)

with open('server.txt') as f:
    servers = tuple(line.rstrip() for line in f)

username, password = 'username', 'password'
pool = Pool()


def exec_commands(server):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()),
        ssh.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
        ssh.connect(server, username=username, timeout=60)
        for cmd in commands:
            ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command(cmd)
            output = ssh_stdout.read()
            print('>', output.rstrip())
        ssh.close() 

pool.map(exec_command, servers)