Maneira limpa de obter um comportamento próximo ao LIFO a partir de multiprocessamento.Queue? (ou mesmo apenas * não * próximo ao FIFO)
Alguém sabe uma maneira limpa de se aproximar do comportamento LIFO ou mesmo não-FIFO (por exemplo, aleatório) demultiprocessing.Queue
?
Pergunta alternativa: Alguém poderia me indicar o código para o encadeamento que gerencia a estrutura de armazenamento real por trásmultiprocessing.Queue
? Parece que seria trivial dentro de fornecer acesso LIFO aproximadamente, mas eu me perdi no buraco do coelho tentando encontrá-lo.
Notas:
Acreditomultiprocessing.Queue
não garante a encomenda. Bem. Mas é quase FIFO tão próximo LIFO seria ótimo.Eu poderia retirar todos os itens atuais da fila e reverter o pedido antes de trabalhar com eles, mas prefiro evitar um kludge, se possível.(editar) Para esclarecer: estou fazendo uma simulação de limite de CPU commultiprocessing
e por isso não pode usar as filas especializadas deQueue
. Como não vi respostas por alguns dias, adicionei a pergunta alternativa acima.
Caso seja um problema, abaixo está uma ligeira evidência de quemultiprocessing.Queue
é quase FIFO. Isso só mostra que em um caso simples (um único thread), é perfeitamente FIFO no meu 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
impressões: min, max e média são exatamente 1 (FIFO perfeito)