2011-06-27 15 views
13

Por alguna razón no puedo acceder a la excepción Queue.Empty - ¿Qué estoy haciendo mal aquí?No se puede acceder a Queue.Empty: "AttributeError: 'function' el objeto no tiene ningún atributo 'Vacío'"

from multiprocessing import Process, Queue 

# ... 

try: 
    action = action_queue.get(False) 
    print "Action: " + action 
except Queue.Empty: 
    pass 

El seguimiento de pila:

Traceback (most recent call last): 
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 258, 
    in _bootstrap 
    self.run() 
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 114, 
    in run 
    self._target(*self._args, **self._kwargs) 
File "D:\Development\populate.py", line 39, in permutate 
    except Queue.Empty: AttributeError: 'function' object has no attribute 'Empty' 

Respuesta

25

La excepción es Queue.Empty en el módulo de cola, no en la clase multiprocessing.queues.Queue. El módulo de multiprocesamiento realmente utiliza la cola (módulo) Vacío clase de excepción:

from multiprocessing import Queue 
from Queue import Empty 
q = Queue() 
try: 
    q.get(False) 
except Empty: 
    print "Queue was empty" 

Si quieres ser muy explícito y detallado, se puede hacer esto:

import multiprocessing 
import Queue 
q = multiprocessing.Queue() 
try: 
    q.get(False) 
execpt Queue.Empty: 
    print "Queue was empty" 

Favorecer el primer enfoque es probablemente una Mejor idea porque solo hay un objeto Queue del que preocuparse y no tiene que preguntarse si está trabajando con la clase o el módulo como en mi segundo ejemplo.

+0

Ah, ya veo, pensé que la importación de Queue importó el módulo, en lugar de la clase. ¡Gracias! – Ross

+1

es aún más interesante: la importación de 'from multiprocessing import Queue' importa la función Queue desde' __init __. Py' en multiproceso que devuelve la clase Queue desde el submódulo multiprocessing.queues. ¡El tipado de patos y los espacios de nombres crean una programación interesante! – underrun

Cuestiones relacionadas