我很想知道是否可以运行一个将函数作为并行子进程调用的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循环和一系列内部函数调用。脚本失败,错误输出如下:
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)
####来自群集的错误消息
线程Thread-3中的异常: Traceback(最近一次调用最后一次): 在 bootstrap_inner中输入文件“/software/apps/python/2.7.2-smhi1/lib/python2.7/threading.py”,第552行 self.run() 运行文件“/software/apps/python/2.7.2-smhi1/lib/python2.7/threading.py”,第505行 self .__ target(* self .__ args,** self .__ kwargs) 在_handle_tasks中输入文件“/software/apps/python/2.7.2-smhi1/lib/python2.7/multiprocessing/pool.py”,第313行 把(任务) PicklingError:无法pickle:属性查找__builtin .function失败
答案 0 :(得分:3)
您可能希望查看multiprocessing - 您的代码可以按如下方式完成:
import multiprocessing
def Parallel(junk):
#...snip...
if __name__ == "__main__":
p = multiprocessing.Pool(8)
results = p.map(Parallel, range(8))
一个警告:不要在交互式口译员中尝试这个。