Después de un breve debate con alguien sobre el manejo de excepciones en Python - provocado por la manipulación de un objeto de cola - que pensé en tirar por ahí ...Python: Queue.Empty manejo de excepciones
MÉTODO 1:
import Queue
q = Queue.Queue()
try:
task=q.get(False)
#Opt 1: Handle task here and call q.task_done()
except Queue.Empty:
#Handle empty queue here
pass
#Opt2: Handle task here and call q.task_done()
MÉTODO 2:
import Queue
q = Queue.Queue()
if q.empty():
#Handle empty queue here
else:
task = q.get()
#Handle task here
q.task_done()
un argumento es que el método 1 es incorrecto porque estar vacía la cola no es un error, y por lo tanto no debe ser manejado usando Queue.Empty excepción. Además, podría hacer que la depuración sea más difícil cuando se codifica de esta manera si se considera que la parte de manejo de tareas podría ser potencialmente grande.
El otro argumento es que de cualquier manera es aceptable en Python y que el manejo de la tarea fuera del try/except podría ayudar depuración si la manipulación tarea es grande, aunque de acuerdo en que este puede tener un aspecto feo que utilizando el método 2.
Opiniones?
ACTUALIZACIÓN: Un poco más de información después de la respuesta 1 apareció .... El debate se inició después de que el método 1 se utilizaba en algún código multiproceso. En ese caso, el código adquirirá el bloqueo (de un objeto Threading.Lock) y lo liberará una vez que la tarea que devolvió o Queue.Empty se haya lanzado
ACTUALIZACIÓN 2: Nos resultaba desconocido que el el objeto queue era thread safe. Parece que intenta/¡excepto que es el camino a seguir!
No veo cómo un candado cambia la respuesta, tampoco entiendo por qué necesita un candado, la cola ya es segura para subprocesos. –