2014-11-16 2 views
0

Я читал несколько часов о том, как globals = globals() работает на Parallel Python, и я все еще немного смущен, может быть, вы можете мне помочь ... Я пишу код, который в принципе можно резюмировать следующим образом:Глобалы, классы и параллельный Python

import pp 

class Foo(object): 
    def __init__(self): 
     self.h = 2 

def f(): 
    foo = Foo() 
    return foo.h 

ppservers =() 
job_server = pp.Server(ppservers=ppservers) 
#print globals() 
g = job_server.submit(f,(), globals = globals()) 
r = g() 

выход «глобальное имя„Foo“не определен», как и некоторые другие столкнулись передо мной ... Я знаю, что аргумент глобалы используется для передачи функций и классов на сервере в упрощенном виде, поэтому я надеялся, что он прошел класс Foo(), как и в глобальных переменных, перед выполнением инструкции job_server.submit (как вы можете видеть, де-комментируя глобальные печати()).

Что мне не хватает в PP, что я должен знать? Есть ли способ сделать этот код без особых изменений?

Спасибо, что прочитали меня, я надеюсь, что некоторые из вас узнают, как это работает!

(Примечание: Я не хочу, чтобы создать экземпляр Foo за пределами распараллеленных рабочих мест, просто потому, что инициализация экземпляра запускает целую программу, которая находится в пределах функций инициализации (сами) ... плохая идея, Я знаю ...)

ответ

0

Это проблема, связанная с тем, что у вас есть возможность отследить дорожку и сопоставить зависимости кода. pp проверяет первый объект, переданный в submit (т. Е. f), и извлекает исходный код ... который затем переходит к другим процессам. Он также передается в любые дополнительные объекты, которые передаются в globals. Однако pp в первую очередь отслеживает функции, классы и модули - у него есть проблемы с экземплярами и многими другими объектами.

Если вы используете вилку pp под названием ppft (она импортирует как pp), она должна работать должным образом. ppft использует лучший пакет проверки кода (dill.source от dill), чтобы извлечь исходный код из более широкого диапазона объектов python и более сложных зависимостей.

>>> import pp 
>>> class Foo(object): 
... def __init__(self): 
...  self.h = 2 
... 
>>> def f(): 
... foo = Foo() 
... return foo.h 
... 
>>> ppservers =() 
>>> job_server = pp.Server(ppservers=ppservers) 
>>> g = job_server.submit(f,(), globals=globals()) 
>>> r = g() 
>>> r 
2 

Получить ppft здесь: https://github.com/uqfoundation

Это также pip устанавливаемая.

Смежные вопросы