Una forma limpia de obtener un comportamiento cercano al LIFO a partir del multiprocesamiento. (o incluso solo * no * cerca de FIFO)
¿Alguien sabe una manera limpia de obtener un comportamiento cercano a LIFO o incluso no cercano a FIFO (por ejemplo, aleatorio) demultiprocessing.Queue
?
Pregunta alternativa: ¿Alguien podría indicarme el código del subproceso que administra la estructura de almacenamiento real detrás?multiprocessing.Queue
? Parece que sería trivial dentro de eso proporcionar un acceso LIFO aproximadamente, pero me perdí en el agujero del conejo tratando de encontrarlo.
Notas:
Yo creomultiprocessing.Queue
no garantiza orden. Multa. Pero está cerca de FIFO, así que cerca de LIFO sería genial.Podría sacar todos los elementos actuales de la cola e invertir el orden antes de trabajar con ellos, pero prefiero evitar un poco de información si es posible.(Editar) Para aclarar: estoy haciendo una simulación de CPU conmultiprocessing
y así no pueden usar las colas especializadas deQueue
. Como no he visto ninguna respuesta durante unos días, he agregado la pregunta alternativa anterior.
En caso de que sea un problema, a continuación hay una ligera evidencia de quemultiprocessing.Queue
es cerca de FIFO. Simplemente muestra 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ín, máx y promedio son exactamente 1 (FIFO perfecto)