Импорт модулей в python-заданиях с dispy

Я работаю с программой, которая работает в параллельном исполнении с дисплеем. Я использую dispy для создания задач, а затем распределяю их по разным процессорам для выполнения.

У меня есть стандартные библиотеки и разработанные мной библиотеки (данные и связь).

Код выглядит так:

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. Но когда я так работаю и в процедуре вычисления вызываю функцию данных, она выдает и исключение, что данные не определены, и выводит исключение Нет.

Любая помощь? Документация предлагает настройки использования, но я не могу понять, как это работает.

2 ответа

JobCluster(compute, depends=[data])

Укажите, что функция comoute зависит от того, какие модули вам нужны.

Положить import data вызов внутри функции вычисления.

Dispy отправляет функцию для вызова вместе со своими аргументами в новый процесс. Новый процесс не имеет импортированных данных. Вот почему добавление import data внутри определения функции должно это исправить.

Если это модуль, о котором вы знаете, что он установлен на всех машинах, вы можете просто импортировать данные и соединения внутри функции вычислений.

Я знаю, что это не элегантно, но у меня работает, и есть 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)
Другие вопросы по тегам