Python中并行处理线程

时间:2014-11-10 07:08:11

标签: python multithreading python-3.x multiprocessing subprocess

我正在尝试使用python多线程在远程节点上运行不同的bash脚本。第一个线程t1触发script1,这应该先在其他线程之前完成。然后,第二个线程t2必须再触发3个脚本。我使用过Popen()因为它不需要等到脚本完全执行。因此,同时所有这3个脚本现在必须处于运行模式。然后,在200secs之后必须启动另一个线程,触发不同的脚本。我甚至可以使用Timer并在200secs之后运行一个线程,但它有时对我不起作用。

因此,在我的情况下,除了第一个线程t1之外,所有线程应该并发运行。因此,所有脚本script2,script3,script4都需要同时执行,而script5应该在200secs之后执行。

我很困惑,如果我应该在这里使用python多处理或python多线程。到目前为止,我只尝试过使用python多线程。

此处的每个脚本都使用python vxargs程序并行运行在多个远程节点上。我使用script2中的top命令捕获cpu利用率,这是使用script3中的tcpdump传输到网络的数据包的长度。在某一点上,我需要杀死这两个进程(top,tcpdump),所以我使用script5使用kill命令杀死它们。如果我在10个远程节点上运行这些脚本,我得到的结果可能只有4个节点。处理这些脚本2,脚本3或脚本5之一可能存在问题,最重要的是处理脚本5,因为在我看来,脚本5不会杀死顶级的tcpdump进程。我想让它稳定,即适用于所有远程节点。这是我的代码:

(在我的代码中,file1.txt包含所有远程节点的列表,我的脚本使用vxargs运行)

class plThreads (threading.Thread):

    def __init__(self,threadID,name):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name

    def run(self):
        print "starting thread "+self.name
        pyFunction(self.name)
        print "Exiting thread "+self.name

def pyFunction(threadName):
    if threadName == 'thread1':
        global startTime
        startTime=time.time()
        subprocess.Popen("python vxargs -a file1.txt ssh -l user_name {} 'bash script1.sh'", shell=True)

    elif threadName == 'thread2': 
        subprocess.Popen("python vxargs -a file1.txt ssh -l user_name {} 'bash script2.sh'", shell=True)

        subprocess.Popen("python vxargs -a file1.txt ssh -l user_name {} 'bash script3.sh'", shell=True)

        subprocess.Popen("python vxargs -a file1.txt ssh -l user_name {} 'bash script4.sh'", shell=True)

    elif threadName == 'thread3':
        subprocess.call("python vxargs -a file1.txt ssh -l user_name {} 'bash script5.sh'", shell=True)

t1=plThreads(1,"thread1")
t1.start()
t1.join()

t2=plThreads(2, "thread2")
t2.start()

while(1):
    timediff = time.time()-startTime
    if timediff >= 200:
        t3=plThreads(3,"thread3")
        t3.start()
        break

提前致谢!!

0 个答案:

没有答案