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)

questionAnswers(2)

yourAnswerToTheQuestion