2010-11-11 13 views
12

tengo unaAttributeError: objeto '_MainProcess' no tiene atributo '_exiting'

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

desde una aplicación Python. Lamentablemente, este código tiene que ejecutar Python 2.5 y, por lo tanto, el módulo processing hoy en día conocido como multiprocessing. Lo que estaba haciendo es crear un Process con un Queue y un put un elemento en la cola del proceso principal. Al observar el código processing.queue, puedo ver que se ha iniciado un hilo de conexión. Este hilo del alimentador comprobará currentProcess()._exiting, pero currentProcess() se evalúa a _MainProcess que no tiene dicho atributo como se puede ver en el módulo processing.process. ¿Cómo resolver esto? ¿Es un error en processing? En caso afirmativo, ¿puedo simplemente ponerle un monopatín usando currentProcess()._exiting = False?

ejemplo Mínimo:

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

¿Puede publicar un fragmento que reproduzca el error? Además, me gusta mucho la palabra * monkeypatch *. Esperando usarlo pronto :) –

+0

Creo que hay una manera correcta de hacer lo que quieras sin parches. – khachik

+0

@ Space_C0wb0y Lo siento, tuve algunos problemas para reducir esas 3k líneas de código a un ejemplo más pequeño. : -/ –

Respuesta

1

No estoy seguro de por qué desea para el decapado de una función en este caso, si realmente quiere hacer que echar un vistazo a esta respuesta: Is there an easy way to pickle a python function (or otherwise serialize its code)?

lo contrario , esto funciona para Python 2.6 (sé que estás buscando 2.5 pero no tengo 2.5). He reemplazado su función lambda con una función normal y se lo proporciono al constructor de procesamiento:

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

Lo siento, pero te perdiste por completo el punto. El problema es que no es obvio por el mensaje de error que se pasó el objeto no elegible. La lambda es solo un ejemplo para un objeto no elegible. –

+0

pero es por eso que te di el enlace para seleccionar una función python y puedes poner la función escabechada en tu cola, y cuando la obtienes de la cola puedes reconstruir la función – DrDee

+0

Aún te falta el punto por completo. El problema inicial fue el mensaje de error. La mitad de la solución fue descubrir que fue causada por un objeto no elegible. Trabajar alrededor de objetos no elegibles es trivial una vez que sabes cuál es la causa. La parte faltante es arreglar el mensaje de error. –

Cuestiones relacionadas