我正在使用一个与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
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()
`
问题是我需要在主要工作中使用数据和连接,它可以正常工作,如果我将compute作为函数调用而不是使用dispy库。 但是当我这样工作并且在计算过程中调用一个数据函数时,它会抛出并且异常没有定义数据并且打印异常无。
有任何帮助吗?文档建议使用设置,但我无法弄清楚它是如何工作的。
答案 0 :(得分:0)
将import data
调用放在compute函数中。
Dispy发送函数以及其对新进程的参数进行调用。新流程没有导入数据。这就是为什么在函数定义中添加import data
应该解决这个问题。
答案 1 :(得分:0)
JobCluster(compute, depends=[data])
指定comoute函数取决于所需的任何模块。
答案 2 :(得分:0)
如果它是一个模块,您知道所有计算机都已安装了该模块,则只需导入数据,计算功能内部的连接即可。
我知道它并不优雅,但对我有用,有2种选择:
摆脱主要功能,并将其放在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)