如何在python中运行并行程序

如何在python中运行并行程序,python,Python,我有一个python脚本,可以使用os.subprocess模块运行一些外部命令。但其中一个步骤需要花费大量时间,因此我想单独运行它。我需要启动它们,检查它们是否完成,然后执行下一个非并行命令。 我的代码是这样的: nproc = 24 for i in xrange(nproc): #Run program in parallel #Combine files generated by the parallel step for i in xrange(nproc): ha

我有一个python脚本,可以使用os.subprocess模块运行一些外部命令。但其中一个步骤需要花费大量时间,因此我想单独运行它。我需要启动它们,检查它们是否完成,然后执行下一个非并行命令。 我的代码是这样的:

nproc = 24 
for i in xrange(nproc):
    #Run program in parallel

#Combine files generated by the parallel step
for i in xrange(nproc):
    handle = open('Niben_%s_structures' % (zfile_name), 'w')
    for i in xrange(nproc):
        for zline in open('Niben_%s_file%d_structures' % (zfile_name,i)):handle.write(zline)
    handle.close()

#Run next step
cmd = 'bowtie-build -f Niben_%s_precursors.fa bowtie-index/Niben_%s_precursors' % (zfile_name,zfile_name)

您可以使用线程来完成。这是一个非常简短(未经测试)的示例,其中包含非常难看的if-else,关于您在线程中实际执行的操作,但是您可以编写自己的worker类

import threading

class Worker(threading.Thread):
    def __init__(self, i):
        self._i = i
        super(threading.Thread,self).__init__()

    def run(self):
        if self._i == 1:
            self.result = do_this()
        elif self._i == 2:
            self.result = do_that()

threads = []
nproc = 24 
for i in xrange(nproc):
    #Run program in parallel        
    w = Worker(i)
    threads.append(w)
    w.start()
    w.join()

# ...now all threads are done

#Combine files generated by the parallel step
for i in xrange(nproc):
    handle = open('Niben_%s_structures' % (zfile_name), 'w')
    ...etc...

并行运行也可以使用Python中的多个进程来实现。不久前我写了一篇关于这个话题的博客,你可以在这里找到

基本上,这个想法是使用“工作进程”,它独立地从队列中检索作业,然后完成这些作业


以我的经验来看,它运行得相当好。

以你的例子来说,你只想并行地进行开发,而不需要线程

子流程
模块中使用
Popen
构造函数:

为生成的每个进程收集
Popen
实例,然后
wait()
等待它们完成:

procs = []
for i in xrange(nproc):
    procs.append(subprocess.Popen(ARGS_GO_HERE)) #Run program in parallel
for p in procs:
    p.wait()

您可以不受影响(而不是使用
多处理
线程
模块),由于您对这些互操作并不真正感兴趣,您只希望操作系统并行运行它们,并确保在合并结果时它们都已完成……

这实际上不会并行执行任何操作,因为在线程完成之前,
join()
阻塞(阻止其他线程启动)。请看我的答案,了解如何避开这个问题。+1由于某种原因,我在阅读问题时忽略了这个细节。这绝对是运行外部命令的方式。这是完美的。这正是我想要的,比其他答案简单得多。线程示例对于其他方面非常有用,尽管如此,谢谢anyway@Daren托马斯:如果我想得到每个过程的结果呢?@hguser,仔细阅读模块
子过程
-你可以重定向
STDOUT
和friends:-)@DarenThomas,如果您能看一下,我将不胜感激,谢谢您抽出时间。