使用dispy导入python作业中的模块
我正在使用一个与dispy并行执行的程序。 我使用dispy创建任务,然后将其分发到不同的CPU以执行 我有标准库和由我开发的库(数据和连接) 代码如下所示:使用dispy导入python作业中的模块,python,python-2.7,hpc,dispy,Python,Python 2.7,Hpc,Dispy,我正在使用一个与dispy并行执行的程序。 我使用dispy创建任务,然后将其分发到不同的CPU以执行 我有标准库和由我开发的库(数据和连接) 代码如下所示: import dispy import sys import data import connection def compute(num): #some code that call data and connection methods, and generate a solution return solution
import dispy
import sys
import data
import connection
def compute(num):
#some code that call data and connection methods, and generate a solution
return solution
def main():
cluster = dispy.JobCluster(compute)
jobs = []
for i in range(10)
job = cluster.submit(i)
job.id = i # optionally associate an ID to job (if needed later)
jobs.append(job)
for job in jobs:
job()
print "Result = " + str(job.result)
print "Exception = " + str(job.exception)
if __name__ == "__main__":
main()
`
问题是,如果在主def中使用数据和连接,我需要一切正常,如果我将compute作为函数调用,而不是使用dispy库。
但当我这样工作时,在计算过程中调用一个数据函数时,它抛出一个异常,数据未定义,而打印异常无
有什么帮助吗?文档建议使用设置,但我不知道它是如何工作的。将
导入数据调用放入compute函数中
Dispy将要调用的函数及其参数一起发送到新进程。新进程没有导入数据。这就是为什么在函数定义中添加import data
可以解决这个问题。将import data
调用放在compute函数中
JobCluster(compute, depends=[data])
Dispy将要调用的函数及其参数一起发送到新进程。新进程没有导入数据。这就是为什么在函数定义中添加import data
可以解决这个问题
JobCluster(compute, depends=[data])
指定comoute函数取决于所需的模块
指定comoute函数取决于所需的模块 如果它是一个您知道所有机器都安装了它的模块,那么您可以在计算函数中导入数据和连接
我知道它并不优雅,但对我来说很有用,有两种选择:
去掉main函数并将其放在if主块中,因为它很可能在函数进入集群时执行。
在一个大函数中定义所有模块数据并将其传递给集群,这是一种非常简单但功能强大的方法
import dispy
import sys
def compute(num):
def data_func1(json_):
#do something to json_
return json_
def data_func2(json_):
#do something diff
return json_
#some code that call data and connection methods, and generate a solution
return solution
if __name__ == "__main__":
cluster = dispy.JobCluster(compute)
jobs = []
for i in range(10)
job = cluster.submit(i)
job.id = i # optionally associate an ID to job (if needed later)
jobs.append(job)
for job in jobs:
job()
print "Result = " + str(job.result)
print "Exception = " + str(job.exception)
或者在脚本中定义所有函数,并根据需要在作业集群创建时传递所有函数,如
import dispy
import sys
def data_func1(json_):
#do something to json_
return json_
def data_func2(json_):
#do something diff
return json_
class DataClass:
pass
def compute(num):
#some code that call data and connection methods, and generate a solution
return solution
if __name__ == "__main__":
cluster = dispy.JobCluster(compute, depends=[data_func1,
data_func2,
DataClass])
jobs = []
for i in range(10)
job = cluster.submit(i)
job.id = i # optionally associate an ID to job (if needed later)
jobs.append(job)
for job in jobs:
job()
print "Result = " + str(job.result)
print "Exception = " + str(job.exception)
如果它是一个您知道所有机器都安装了它的模块,那么您只需在计算函数中导入数据和连接即可
我知道它并不优雅,但对我来说很有用,有两种选择:
去掉main函数并将其放在if主块中,因为它很可能在函数进入集群时执行。
在一个大函数中定义所有模块数据并将其传递给集群,这是一种非常简单但功能强大的方法
import dispy
import sys
def compute(num):
def data_func1(json_):
#do something to json_
return json_
def data_func2(json_):
#do something diff
return json_
#some code that call data and connection methods, and generate a solution
return solution
if __name__ == "__main__":
cluster = dispy.JobCluster(compute)
jobs = []
for i in range(10)
job = cluster.submit(i)
job.id = i # optionally associate an ID to job (if needed later)
jobs.append(job)
for job in jobs:
job()
print "Result = " + str(job.result)
print "Exception = " + str(job.exception)
或者在脚本中定义所有函数,并根据需要在作业集群创建时传递所有函数,如
import dispy
import sys
def data_func1(json_):
#do something to json_
return json_
def data_func2(json_):
#do something diff
return json_
class DataClass:
pass
def compute(num):
#some code that call data and connection methods, and generate a solution
return solution
if __name__ == "__main__":
cluster = dispy.JobCluster(compute, depends=[data_func1,
data_func2,
DataClass])
jobs = []
for i in range(10)
job = cluster.submit(i)
job.id = i # optionally associate an ID to job (if needed later)
jobs.append(job)
for job in jobs:
job()
print "Result = " + str(job.result)
print "Exception = " + str(job.exception)
你能为你得到的异常添加stacktrace吗?Exception=Traceback(最近一次调用最后一次):文件“dispynode.py”,第186行,在globals()文件“”,第1行,在文件“”,第47行,在compute NameError中:未定义全局名称“data”
是否可以为正在获取的异常添加stacktrace?Exception=Traceback(最近一次调用):文件“dispynode.py”,第186行,在globals()文件“”,第1行,文件“”,第47行的“dispy”,在compute NameError中:未定义全局名称“data”
如果我这样做,则导入的第二个用户将返回一个错误。ImportError:没有名为connection的模块,因此您需要将导入连接
添加到compute函数中。其思想是,运行compute所需的所有模块都必须在compute内部导入。在示例代码中,compute函数中包含导入,而compute函数中不包含导入。它们与compute函数在同一个文件中。你修改过这个吗?如果我这样做,第二个被导入的人会返回一个错误。ImportError:没有名为connection的模块,因此您需要将导入连接
添加到compute函数中。其思想是,运行compute所需的所有模块都必须在compute内部导入。在示例代码中,compute函数中包含导入,而compute函数中不包含导入。它们与compute函数在同一个文件中。你修改过这个吗?