2016-07-27 2 views
0

В настоящее время я пишу код в Python 2.7, который включает в себя создание объекта, в котором у меня есть два метода класса и другие обычные методы. Мне нужно использовать эту конкретную комбинацию методов из-за более широкого контекста кода, который я пишу, - это не имеет отношения к этому вопросу, поэтому я не буду углубляться в суть.Почему моя переменная @classmethod "не определена"?

В моей функции __init__ я создаю пул (объект многопроцессорности). При создании этого я вызываю функцию настройки. Эта функция настройки является классом @classmethod. Я определяю несколько переменных в этой функции установки, используя синтаксис cls.variablename. Как я уже упоминал, я называю эту функцию установки внутри моей функции init (внутри создания пула), поэтому эти переменные должны создаваться, основываясь на том, что я понимаю.

Позже в моем коде я вызываю несколько других функций, что в конечном итоге приводит ко мне вызов другого @classmethod внутри того же объекта, о котором я говорил ранее (тот же объект, что и первый класс @classmethod). В этом классе @classmethod я пытаюсь получить доступ к cls.variables, который я создал в первом классе @classmethod. Тем не менее, Python говорит мне, что мой объект не имеет атрибута «cls.variable» (используя общие имена здесь, очевидно, мои фактические имена относятся к моему коду).

ANYWAYS ... Я понимаю, что это, вероятно, довольно запутанно. Вот некоторые (очень) обобщенный пример кода, чтобы проиллюстрировать ту же идею:

class General(object): 
    def __init__(self, A): 
     # this is correct syntax based on the resources I'm using, 
     # so the format of argument isn't the issue, in case anyone 
     # initially thinks that's the issue 
     self.pool = Pool(processes = 4, initializer=self._setup, initargs= (A,) 

    @classmethod 
    def _setup(cls, A): 
     cls.A = A 

    #leaving out other functions here that are NOT class methods, just regular methods 

    @classmethod 
    def get_results(cls): 
     print cls.A 

ошибка я получаю, когда я получаю эквивалент print cls.A line заключается в следующем:

AttributeError: type object 'General' has no attribute 'A' 

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

G = General(5) 
G.get_results() 

Итак, я создаю экземпляр объекта (в котором я создаю бассейн, который вызывает функцию настройки), а затем вызывает get_results.

Что я делаю неправильно?

+1

Вы когда-нибудь называли 'General._setup'? – chepner

+3

В частности, вы когда-нибудь вызывали 'General._setup' в процессе, который назывался' General.get_results'? – user2357112

+0

@chepner Я вызываю его, когда создаю объект Pool в своей функции init. – Ria

ответ

1

Причина General.A не нужно определять в основном процессе является то, что multiprocessing.Pool работает только в подразделы процессов General._setup. Это означает, что в главном процессе будет вызван не (где вы вызываете Pool).

Вы получаете 4 процесса, где в каждом из них находится General.A, но не в основном процессе. Фактически вы не инициализируете такой пул (см. this answer на вопрос How to use initializer to set up my multiprocess pool?)

Вы хотите, чтобы Object Pool, который не был первоначально импортирован в Python. В StackOverflow есть вопрос Python Implementation of the Object Pool Design Pattern, но вы можете найти кучу, просто выполнив поиск в Интернете.

+0

@Ria Возможно, вам не хватает некоторых функций. Этот веб-сайт говорит, что доступно автономное репо [здесь] (https://github.com/aholmberg/driver-multiprocessing) – Artyer

+0

@ Ria: Да, вы последовали за ним неправильно. Примеры в этой ссылке никогда не пытаются получить доступ к чему-либо, установленному в инициализаторе пула, из основного процесса, потому что эта инициализация никогда не происходит в основном процессе. – user2357112

+0

@Artyer Спасибо за помощь. В моем примере кода я оставил много функций, потому что думал, что они просто сделают вещи более запутанными, и поэтому я думаю, что у меня есть все они в моем фактическом коде. Но это очень возможно, я что-то пропустил. Еще раз спасибо! – Ria

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