私はこれを行うための最善の方法は次のようになりますことを決めた私は、ビットストリームは、私は必要な結果を処理できるよりも早くに来ていた問題(エラー訂正が遅い)デキュー異なるサイズの「アイテム」
を持っています準備ができたらストリームをキューに入れ、そのチャンクを削除します。私はチャンクに入れる前にチャンクのサイズを決定するために非常に迅速な処理を行います。
キューからチャンクを削除しようとすると、そのサイズに関するすべての情報が失われてしまい、q.get()はキューに配置された最後のチャンクのサイズを返します(サイズは同じではありません)。元のチャンク)。これは、処理がビットストリームチャンク内のそれらの位置に応じてデータの断片を除去し除去するので問題である。したがって、チャンクが短い場合、間違ったビットが削除され、含まれている情報が失われます。
キューから適切なサイズのアイテムを抽出するには、どのようにq.get()を使用できますか?
は、ここに私の単純化されたコードである(しかし、それはその有用ではありません):
ここq = Queue.Queue(maxsize=0)
rq = Queue.Queue(maxsize=0)
def dosomething(q, rq)
data = q.get()
#process data (takes a few seconds)
q.task_done()
rq.put(processed_data)
sock.timeout = 5.00
while True:
try:
data, addr = sock.recvfrom(65536)
chunk = data[0:x] # where x is the length of data needed
q.put_nowait(chunk)
thread = threading.Thread(target=dosomething, args=(q, rq,))
thread.start()
except RuntimeError:
continue
except socket.timeout:
break
print(rq.get())
rq.task_done()
thread.join()
は、結果がビットストリームがサイズ5、4、3、2の塊に遭遇した場合には何かということです、および1:キューに決して複数の項目が存在するように入力-If
は、遅い、出力チャンクサイズは-If 5、4、3、2、1
あります入力が速いのでキューが大きくなり、出力チャンクのサイズは3,1,1,1,1のようになります。