LIFOに近い、あるいはFIFOに近い(例えば、ランダムな)動作でもない人は、multiprocessing.Queue
から清潔な方法を知っていますか?マルチプロセッシングからLIFOに近い動作を得るきれいな方法.Queue? (または、FIFOの近くではないだけでも)
代替の質問:実際のストレージ構造を管理するスレッドのコードに誰かを指摘できますか?multiprocessing.Queue
? LIFOアクセスを提供するのはそんなに簡単ではないようですが、私はウサギの穴でそれを見つけようとしています。
注:
- 私は
multiprocessing.Queue
does not guarantee orderを信じています。ファイン。しかし、FIFOに近いので、LIFOに近いでしょう。 - 私は現在のアイテムをすべてキューから取り除いて作業をする前にその順序を逆にすることができますが、可能であればkludgeを避けることをお勧めします。
明確にする(編集):私はmultiprocessing
とCPUバウンドシミュレーションをやっているので、Queue
から専門的なキューを使用することはできません。私は数日間何の答えも見なかったので、上記の代替質問を追加しました。場合
それは、以下の問題であるmultiprocessing.Queue
が近く-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
プリント:それは単純なケース(シングルスレッド)で、それは私のシステムでFIFO完璧であることを示している分、最大、および平均は正確に1が(完璧FIFO)
賢いテスト... – mgilson
すべての追加が完了した後でLIFOデータが必要なのですか、または新しい値がまだ追加されている間に最新のデータを取得したいのですか?前者の場合は、キューの内容を逆にするのが最も簡単です。あなたがLIFOアクセスを "生きて"いるなら、多分 'マルチプロセッシング'モジュールからの共有メモリプリミティブを使って独自のデータ構造を書く必要があります。 – Blckknght
@Blckknghtすべてがそこに来るまで待つことができれば、それはかなり簡単です(オプション2)が、キューがスタックとして動作するようにするための継続的なシミュレーションです。私はプリミティブを素早く見て、キュー処理スレッドをカスタマイズすることを望んでいましたが、その頭や尾を作ることができませんでした。私が簡単な方法を見つけることができない場合、それを調査することは私の次のステップです。コメントありがとう! – KobeJohn