使用dispy在python作业中导入模块

时间:2016-05-29 15:40:37

标签: 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

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库。 但是当我这样工作并且在计算过程中调用一个数据函数时,它会抛出并且异常没有定义数据并且打印异常无。

有任何帮助吗?文档建议使用设置,但我无法弄清楚它是如何工作的。

3 个答案:

答案 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)