Импорт модулей в 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)