誰かがLIFOに近い、またはFIFOに近い(たとえばランダムな)動作を取得するためのクリーンな方法を知っていmultiprocessing.Queue
ますか?
別の質問:誰かが、背後にある実際のストレージ構造を管理するスレッドのコードを教えてもらえmultiprocessing.Queue
ますか?ほぼLIFOアクセスを提供することはその中で些細なことのように思えますが、私はそれを見つけようとしてウサギの穴で迷子になりました。
ノート:
multiprocessing.Queue
注文を保証するものではないと思います。罰金。しかし、それは近FIFOなので、近LIFOは素晴らしいでしょう。- 現在のすべてのアイテムをキューから取り出して、それらを操作する前に順序を逆にすることもできますが、可能であれば、ごちゃごちゃしたものは避けたいと思います。
(編集)明確にするために:私はCPUバウンドシミュレーションを実行しmultiprocessing
ているため、からの特殊なキューを使用できませんQueue
。数日間答えが見られなかったので、上記の別の質問を追加しました。
multiprocessing.Queue
それが問題である場合、以下はFIFOに近いわずかな証拠です。単純なケース(シングルスレッド)では、システム上で完全にFIFOであることを示しています。
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
印刷:最小、最大、および平均は正確に1(完全なFIFO)