Qualcuno conosce un modo pulito per avvicinarsi al comportamento LIFO o persino non vicino a FIFO (ad esempio casuale) da multiprocessing.Queue
?Modo pulito per avvicinarsi al comportamento LIFO dal multiprocessing.Queue? (o anche solo * not * near-FIFO)
Domanda alternativa: Qualcuno potrebbe indicarmi il codice per il thread che gestisce la struttura di archiviazione effettiva dietro multiprocessing.Queue
? Sembra che sia banale trovare un accesso LIFO, ma mi sono perso nella tana del coniglio cercando di trovarlo.
Note:
- credo
multiprocessing.Queue
does not guarantee order. Belle. Ma è vicino-FIFO così vicino-LIFO sarebbe fantastico. - Potrei rimuovere tutti gli elementi correnti dalla coda e invertire l'ordine prima di lavorare con loro, ma preferisco evitare un kludge se possibile.
(edit) Per chiarire: sto facendo una simulazione legata CPU con multiprocessing
e quindi non è possibile utilizzare le code specializzati da Queue
. Poiché non ho visto alcuna risposta per alcuni giorni, ho aggiunto la domanda alternativa sopra.
Nel caso in cui si tratta di un problema, di seguito è lieve prova che multiprocessing.Queue
è vicina-FIFO. Questo dimostra che in un caso semplice (un singolo thread), è perfettamente FIFO sul mio 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
stampe: min, max, e media sono esattamente 1 (FIFO perfetta)
test intelligente ... – mgilson
Hai solo bisogno dei dati LIFO dopo che sono state fatte tutte le aggiunte, o vuoi la possibilità di ottenere i dati più recenti mentre vengono aggiunti nuovi valori? Se il primo, penso che invertire il contenuto della coda è più facile. Se si "vivi" l'accesso LIFO, sarà probabilmente necessario scrivere la propria struttura dati utilizzando le primitive della memoria condivisa dal modulo 'multiprocessing'. – Blckknght
@Blckknght Sì, se posso aspettare fino a quando tutto è lì, allora è piuttosto semplice (opzione 2) ma è una simulazione in corso in cui voglio che la coda agisca approssimativamente come una pila. Ho dato una rapida occhiata ai primitivi, sperando di personalizzare il thread di gestione della coda, ma non sono riuscito a farne testa o croce. Indagando che è il mio prossimo passo se non riesco a trovare un modo semplice. Grazie per il commento! – KobeJohn