1

我正在使用一个与 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() 

`

问题是我需要在主定义中使用数据和连接时它工作正常,如果我将计算调用为函数而不是使用 dispy 库。但是当我这样工作并在计算过程中调用一个数据函数时,它会抛出异常,即数据未定义并打印异常无。

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

4

3 回答 3

0

import data调用放在计算函数中。

Dispy 将要调用的函数连同它的参数一起发送给新进程。新流程没有导入数据。这就是为什么import data在函数定义中添加应该解决这个问题。

于 2016-05-29T16:36:06.510 回答
0
JobCluster(compute, depends=[data])

指定 comoute 函数取决于您需要的任何模块。

于 2018-08-05T08:09:47.877 回答
0

如果它是一个你知道所有机器都安装了它的模块,你可以在计算函数中导入数据、连接。

我知道它并不优雅,但对我有用,有两种选择:

去掉 main 函数,把它放在 if main 块中,因为它很可能在函数进入集群时执行。在一个大函数中定义所有模块数据并将其传递给集群,这是一种非常简单但功能强大的方法。

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)
于 2020-01-27T04:26:45.163 回答