python的子进程模块中的多线程

时间:2015-01-14 09:36:14

标签: python multithreading ssh subprocess

我有几个Unix服务器上运行了一个应用程序,我需要从应用程序日志中在每个服务器上grep一些模式,并将所有服务器的grep结果放入一个统一文件中。

这就是我目前正在做的事情。

def run_command(command):
   ps = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True)
   out,err = ps.communicate()
   if err != "":
     return err
   else:
     return out



Server_List = [['ServerA','BecomeAccountA'],['ServerB','BecomeAccountB'],['ServerC','BecomeAccountC'],['ServerD','BecomeAccountD']]
Final_Result = ""
path = "some/path/"
pattern = "FindMe"
for list in Server_List:
    server= list[0]
    becomeaccount = list[1]
    command="ssh -oConnectTimeout=5 -oBatchMode=yes -l %s %s 'grep %s %s'" % (becomeaccount,server,pattern,path)
    result = run_command(command)
    Final_Result+=result

with open("/some/path/output",'w') as f:
f.write(Final_Result)

现在我的output文件包含以下内容:

14012015.1449.30 [INFO] something FindMe something
14012015.1449.40 [INFO] something FindMe something
14012015.1450.13 [INFO] something FindMe something
14012015.1450.48 [INFO] something FindMe something
14012015.1451.04 [INFO] something FindMe something
14012015.1451.19 [INFO] something FindMe something
14012015.1451.77 [INFO] something FindMe something
14012015.1452.09 [INFO] something FindMe something

要在output文件中获得此结果,我必须依次与所有服务器建立ssh连接,这需要一段时间来处理。我需要减少代码花费的时间才能获得最终输出。我想知道我可以在多线程中做到这一点吗?我的意思是一次建立多个ssh连接?我从来没有尝试过多线程。

注意: - output文件中行的顺序并不重要,因此也不需要ssh连接的顺序,因为我总是可以对{{{ 1}}带有时间的文件,因为它在每行的开头都有时间戳。

1 个答案:

答案 0 :(得分:1)

我认为ps.communicate()将一直等到读取进程的所有输出。 这使您的程序顺序。

正如您所提到的,生成线程可能更好,其中每个线程调用一个子进程并处理进程输出/错误的读取。

收集输出时,您需要将它们放在允许并行访问的队列或列表中,例如,请参阅队列模块。

最后你还需要加入"线程,即。等待所有线程终止。