IPython并行计算命名空间问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了IPython并行计算命名空间问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2511字,纯文字阅读大概需要4分钟。
内容图文
我一直在阅读和重新阅读IPython文档/教程,我无法弄清楚这段特殊代码的问题.似乎函数dimensionless_run对于传递给每个引擎的命名空间是不可见的,但我很困惑因为函数在__main__中定义,并且作为全局命名空间的一部分清晰可见.
wrapper.py:
import math, os
def dimensionless_run(inputs):
output_file = open(inputs['fn'],'w')
...
return output_stats
def parallel_run(inputs):
import math, os ## Removing this line causes a NameError: global name 'math'
## is not defined.
folder = inputs['folder']
zfill_amt = int(math.floor(math.log10(inputs['num_iters'])))
for i in range(inputs['num_iters']):
run_num_str = str(i).zfill(zfill_amt)
if not os.path.exists(folder + '/'):
os.mkdir(folder)
dimensionless_run(inputs)
return
if __name__ == "__main__":
inputs = [input1,input2,...]
client = Client()
lbview = client.load_balanced_view()
lbview.block = True
for x in sorted(globals().items()):
print x
lbview.map(parallel_run,inputs)
在ipcluster start –n = 6之后执行此代码会生成已排序的全局字典,包括math和os模块,以及parallel_run和dimensionless_run函数.接下来是一个IPython.parallel.error.CompositeError:调用方法的一个或多个异常:parallel_run,它由大量[n:apply]组成:NameError:全局名称’dimensionless_run’未定义,其中n从0-5开始.
有两件事我不明白,而且它们有明显的联系.
>为什么代码不能识别全局命名空间中的dimensionless_run?
>为什么导入数学,os必须在parallel_run的定义中?
编辑:事实证明,没有太多的命名空间错误 – 我在一个不包含代码的目录中执行ipcluster start –n = 6.要修复它,我需要做的就是在我的代码目录中执行start命令.我还通过添加以下行来修复它:
inputs = input_pairs
os.system("ipcluster start -n 6") #NEW
client = Client()
...
lbview.map(parallel_run,inputs)
os.system("ipcluster stop") #NEW
在正确的位置启动所需的群集.
解决方法:
这大部分都是Python name space issues with IPython.parallel的副本,它有更详细的答案,但要点:
当客户端将parallel_run发送到引擎时,它只发送该函数,而不是发送函数所在的整个命名空间(__main__模块).因此,当运行远程parallel_run时,查找到math或os或dimensionless_run将首先查找locals()(已在函数中定义的内容,即函数内导入),然后在globals()中查找__main__发动机上的模块.
有多种方法可以确保引擎上的名称可用,但最简单的方法是显式定义/发送它们到引擎(引擎上的交互式命名空间是__main__,就像它在IPython本地一样):
client[:].execute("import os, math")
client[:]['dimensionless_run'] = dimensionless_run
在运行之前,在这种情况下,一切都应该按预期工作.
这是交互式/在脚本中定义的模块所特有的问题 – 如果此文件是模块而不是脚本,则不会出现此问题,例如,
from mymod import parallel_run
lbview.map(parallel_run, inputs)
在这种情况下,globals()是模块全局变量,它们在各处通常是相同的.
内容总结
以上是互联网集市为您收集整理的IPython并行计算命名空间问题全部内容,希望文章能够帮你解决IPython并行计算命名空间问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。