2012-07-25 144 views
0

我很想知道是否可以运行一个调用函数作为并行子进程的python脚本。我不确定我是否正确使用这些术语,所以这里是一个由bash脚本构成的概念脚本,可以完成我正在谈论的内容。并行进程

import Zfunctions as Z 
reload(Z) 

def Parallel(): 
    statements 
    calls to other functions in a general function file Z 

#-------------- 
if '__name__' == '__main__': 
    # Running this script in a linux cluster with 8 processing node available 
    Parallel() & #1st process sent to 1st processing node 
    Parallell() & #2nd process sent to 2nd node 
    . 
    . 
    . 
    Parallell() & #8th process sent to 8th node 
    wait 

现在我所知道的符号(&)和“等待”都错了,但在bash中是发送到进程的背景和等待这些过程完成的方式。我现在的问题是,希望更清楚一点:这可以用python完成,如果可以,怎么做?

任何帮助表示赞赏。

/M

我已经得到了一些很好的帮助。我测试了这个修改我的问题上面,它试图运行60个作业,将处理大量的数据并将结果写入磁盘。所有这些都在一个单独的python文件中,它结合了两个for循环和一系列内部函数调用。该脚本失败和错误输出如下发现:从集群

异常螺纹加工-3

import multiprocessing 

def Parallel(m,w,PROCESSES):                
plist = {}                   
plist['timespan'] = '2007-2008'              
print 'Creating pool with %d processes\n' % PROCESSES         
pool = multiprocessing.Pool(PROCESSES)            
print 'pool = %s' % pool                

TASKS = [(LRCE,(plist,m,w)),(SRCE,(plist,m,w)),(ALBEDO,(plist,m,w)),     
     (SW,(plist,m,w)),(RR,(plist,m,w)),(OLR,(plist,m,w)),(TRMM,(plist,w)),  
     (IWP,(plist,m,w)),(RH,(plist,'uth',m,w)),(RH,(plist,200,m,w)),    
     (RH,(plist,400,m,w)),(IWC,(plist,200,m,w)),(IWC,(plist,400,m,w)),   
     (CC,(plist,200,m,w)),(CC,(plist,400,m,w))]                           

results = [pool.apply_async(calculate,t) for t in TASKS]        
print 'Ordered results using pool.apply_async():'          
for r in results:                  
    print '\t', r.get()                

#-----------------------------------------------------------------------------------  
if __name__ == '__main__':                
PROCESSES = 8                   
for w in np.arange(2):                
    for m in np.arange(2):               
     Parallel(m,w,PROCESSES) 
####错误消息: 回溯(最近通话最后一个): 文件“/软件/ apps/python/2.7.2-smhi1/lib/python2.7/threading.py“,第552行,在 bootstrap_inner self.run() 文件”/software/apps/python/2.7.2-smhi1/lib /python2.7/threading.py“,行505,运行 self .__ target(* self .__ args,** self .__ kwargs) File”/software/apps/python/2.7.2-smhi1/lib/python2 .7/multiprocessing/pool.py“,行313,在_handle_tas KS 放(任务) PicklingError:不能咸菜:属性查找__builtin。功能失败

回答

3

你可能想看看multiprocessing - 你的代码可以实现如下:

import multiprocessing 

def Parallel(junk):  
    #...snip... 

if __name__ == "__main__": 
    p = multiprocessing.Pool(8) 

    results = p.map(Parallel, range(8)) 

一警告:不要在交互式解释器中尝试此操作。

+0

该代码不会返回任何数据。它可以只用于: p.map(并行,范围(8))? 如果每个并行呼叫是相互独立的,“结果”是什么样的? – Shejo284 2012-07-25 12:21:17

+1

@ Shejo284 - python函数总是返回* something *。即使没有明确的return语句,他们也会返回None。所以,在这种情况下,你会得到8个“None”值的列表。你可以选择不存储它:'p.map(Parallel,range(8))'而不是'results = p.map(Parallel,range(8))''。 – mgilson 2012-07-25 12:24:40

+0

伟大的解决方案,谢谢!如果可以的话,最后两个问题。如果我想运行除并行之外的一组不同功能: results = p.map([Parallel,f2,f3,... f8],range(8)) 这是否行得通? 等待,直到每个过程完成之前调用: results = p.map(并行,范围(8)) 可以重复吗? – Shejo284 2012-07-25 12:35:08