2010-11-11 43 views
12

MamAttributeError: obiekt '_MainProcess' nie ma atrybutu '_exiting'

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

z aplikacji Pythona. Niestety ten kod musi uruchomić Python 2.5, a zatem moduł processing obecnie znany jako multiprocessing. To, co robiłem, polega na utworzeniu obiektu Process z elementem oraz w kolejce z procesu głównego. Patrząc na kod processing.queue, widzę, że wątek podajnika jest uruchamiany. Ten wątek podajnika sprawdzi następnie currentProcess()._exiting, ale currentProcess() oceni jako _MainProcess, który nie ma wspomnianego atrybutu, co można zobaczyć w module processing.process. Jak rozwiązać ten problem? Czy jest to błąd w processing? Jeśli tak, czy mogę po prostu go zaimportować za pomocą currentProcess()._exiting = False?

Minimal przykład:

#!/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

Czy możesz zamieścić fragment, który powieliby błąd? Poza tym bardzo podoba mi się słowo * monkeypatch *. Nie mogę się doczekać, aby go wkrótce użyć :) –

+0

Wierzę, że istnieje właściwy sposób robienia tego, co chcesz, bez łatania. – khachik

+0

@ Space_C0wb0y Przykro mi, miałem trochę problemów z redukcją 3k linii kodu do mniejszego przykładu. : -/ –

Odpowiedz

1

Nie jestem pewien, dlaczego chcesz marynowane funkcję w tym przypadku, jeśli naprawdę chcesz to zrobić przyjrzeć się tej odpowiedzi: Is there an easy way to pickle a python function (or otherwise serialize its code)?

inaczej działa to dla Pythona 2.6 (wiem, że szukasz 2.5, ale nie mam 2,5). Zastąpiłem twoją funkcję lambda zwykłą funkcją i przekażę ją konstruktorowi przetwarzania:

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

Przykro mi, ale zupełnie nie rozumiesz. Problem polega na tym, że z komunikatu o błędzie nie wynika, że ​​nie można było pobrać obiektu, który nie mógł zostać pobrany. Wartość lambda jest tylko przykładem dla obiektu, który nie może zostać wyłuskany. –

+0

, ale dlatego dałem ci link do zalewania funkcji Pythona i możesz umieścić wybraną funkcję w swojej kolejce, a kiedy dostałeś ją z kolejki, możesz zrekonstruować funkcję – DrDee

+0

Wciąż całkowicie tęsknisz za punktem. Początkowym problemem był komunikat o błędzie. Połowa rozwiązania polegała na stwierdzeniu, że był spowodowany przez niezdolny do ogarnięcia obiekt. Praca z nierozpoznanymi przedmiotami jest banalna, gdy już wiesz, co jest przyczyną. Brakującą częścią jest naprawienie komunikatu o błędzie. –

Powiązane problemy