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。功能失败
该代码不会返回任何数据。它可以只用于: p.map(并行,范围(8))? 如果每个并行呼叫是相互独立的,“结果”是什么样的? – Shejo284 2012-07-25 12:21:17
@ 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
伟大的解决方案,谢谢!如果可以的话,最后两个问题。如果我想运行除并行之外的一组不同功能: results = p.map([Parallel,f2,f3,... f8],range(8)) 这是否行得通? 等待,直到每个过程完成之前调用: results = p.map(并行,范围(8)) 可以重复吗? – Shejo284 2012-07-25 12:35:08