¿Alguien conoce una forma clara de obtener un comportamiento de LIFO cercano o incluso no cercano a FIFO (por ejemplo, aleatorio) desde multiprocessing.Queue
?Manera limpia de obtener un comportamiento de LIFO cercano del multiproceso. ¿Qué? (o simplemente * no * near-FIFO)
Pregunta alternativa: ¿Alguien podría indicarme el código del hilo que gestiona la estructura de almacenamiento real detrás de multiprocessing.Queue
? Parece que sería trivial proporcionar acceso a LIFO, pero me perdí en el agujero de conejo tratando de encontrarlo.
Notas:
- creo
multiprocessing.Queue
does not guarantee order. Multa. Pero está cerca de FIFO tan cerca de LIFO sería genial. - Podría retirar todos los artículos actuales de la cola e invertir el orden antes de trabajar con ellos, pero prefiero evitar un kludge si es posible.
(EDIT) para aclarar: estoy haciendo una simulación depende de la CPU con multiprocessing
y así no puede utilizar las colas especializadas de Queue
. Como no he visto ninguna respuesta durante unos días, agregué la pregunta alternativa anterior.
En caso de ser un problema, a continuación hay una ligera evidencia de que multiprocessing.Queue
es casi FIFO. Esto demuestra que en un caso simple (un solo hilo), es perfectamente FIFO en mi sistema:
import multiprocessing as mp
import Queue
q = mp.Queue()
for i in xrange(1000):
q.put(i)
deltas = []
while True:
try:
value1 = q.get(timeout=0.1)
value2 = q.get(timeout=0.1)
deltas.append(value2-value1)
except Queue.Empty:
break
#positive deltas would indicate the numbers are coming out in increasing order
min_delta, max_delta = min(deltas), max(deltas)
avg_delta = sum(deltas)/len(deltas)
print "min", min_delta
print "max", max_delta
print "avg", avg_delta
impresiones: mínimo, máximo y promedio son exactamente 1 (FIFO perfecto)
prueba inteligente ... – mgilson
¿Solo necesita los datos de LIFO después de que se hayan realizado todas las adiciones o desea obtener los últimos datos mientras se agregan nuevos valores? Si el primero, creo que invertir el contenido de la cola es más fácil. Si "vives" el acceso a LIFO, probablemente necesitarás escribir tu propia estructura de datos usando las primitivas de memoria compartida del módulo 'multiprocesamiento'. – Blckknght
@Blckknght Sí, si puedo esperar hasta que todo esté allí, entonces es bastante sencillo (opción 2) pero es una simulación en curso en la que quiero que la cola actúe aproximadamente como una pila. Eché un vistazo rápido a las primitivas, con la esperanza de personalizar el hilo de gestión de colas, pero no pude encontrar cara o cruz. Investigar ese es mi siguiente paso si no puedo encontrar una manera fácil. ¡Gracias por el comentario! – KobeJohn