2010-11-11 1 views
12

Я получилAttributeError: объект '_MainProcess' не имеет атрибута '_exiting'

AttributeError: '_MainProcess' object has no attribute '_exiting' 

из приложения Python. К сожалению, этот код должен запускать Python 2.5 и, следовательно, модуль processing, известный сегодня как multiprocessing. То, что я делал, - создать Process с Queue и put элементом в очереди из основного процесса. Заглядывая в код processing.queue, я вижу, что начинается поток фидера. Этот поток фидера будет проверять currentProcess()._exiting, но currentProcess() оценивает _MainProcess, который не имеет указанного атрибута, как видно из модуля processing.process. Как это решить? Это ошибка в processing? Если да, могу ли я просто обезвредить его, используя currentProcess()._exiting = False?

Минимальный пример:

#!/usr/bin/python 

import processing 
import processing.queue 

class Worker(processing.Process): 
    def __init__(self): 
     processing.Process.__init__(self) 
     self.queue = processing.queue.Queue() 

    def run(self): 
     element = self.queue.get() 
     print element 

if __name__ == '__main__': 
    w = Worker() 
    w.start() 
    # To trigger the problem, any non-pickleable object is to be passed here. 
    w.queue.put(lambda x: 1) 
    w.join() 
+0

Можете ли вы опубликовать фрагмент, который воспроизводит ошибку? Кроме того, мне очень нравится слово * monkeypatch *. С нетерпением ждем его скорого использования :) –

+0

Я считаю, что есть правильный способ сделать то, что вы хотите, без исправления. – khachik

+0

@ Space_C0wb0y Извините, у меня было немного проблем с сокращением этих трехмерных строк кода до меньшего примера. : -/ –

ответ

1

Я не уверен, почему вы хотели бы законсервировать функцию в этом случае, если вы действительно хотите сделать это взглянуть на этот ответ: Is there an easy way to pickle a python function (or otherwise serialize its code)?

иначе , это работает для python 2.6 (я знаю, что вы ищете 2.5, но у меня нет 2.5). Я заменил вашу лямбда-функцию на регулярную функцию и предоставил ее конструктору обработки:

from multiprocessing import Process, Queue 

def simple(): 
    return 1 

class Worker(Process): 
    def __init__(self, args): 
     Process.__init__(self, args=args) 
     self.queue = Queue() 

    def run(self): 
     element = self.queue.get() 
     print element 

if __name__ == '__main__': 
    w = Worker(args=[simple]) 
    w.start() 
    w.join() 
+0

Извините, но вы полностью упустили точку. Проблема заключается в том, что из сообщения об ошибке не видно, что объект, не содержащий выбор, был передан. Лямбда - это всего лишь пример для объекта, который не является разборчивым. –

+0

, но именно поэтому я дал вам ссылку на разборку функции python, и вы можете поместить маринованную функцию в свою очередь, и когда вы ее получите из своей очереди, вы сможете восстановить функцию – DrDee

+0

Вы все еще полностью пропустите точку. Первоначальной проблемой было сообщение об ошибке. Половина решения заключалась в выяснении того, что он был вызван не-pickleable объектом. Работа над нераспадаемыми объектами тривиальна, если вы знаете, в чем причина. Недостающая часть предназначена для исправления сообщения об ошибке. –