Python collection s.deque双辺行列の原理を詳しく説明します。


キューは一方の端だけに挿入操作を許可し、他方の端で削除操作を行う線形表です。
Python文書で検索キュー(queue)を見ると、Python標準ライブラリには4つの列が含まれています。それぞれqueue.Que/asyncie/Que/multiprocessing.Que/collection s.dequeです。
collection.deque
dequeはダブルエンド行列の略語で、両端が編集できるので、dequeはスタックを実現するためにも、キューを実現するためにも使えます。
dequeは豊富な操作方法をサポートしています。

list実装のキューに比べて、dequeはより低い時間と空間的複雑さを有することを実現する。リストはチームを出す時と挿入する時の空間の複雑さを実現します。O(n)ぐらいです。dequeはチームを出る時とチームに入る時の時間の複雑さはO(1)です。
dequeはin操作子にも対応しています。次のような書き方ができます。
q=collection.deque([1,2,3,4])
print(5 in q)〹False
print(1 in q)〓〓True
dequeはまた、反時計回りに回転する方法をカプセル化した:rotate。
同前
q=collection.deque([1,2,3,4])
q.rotate(1)
print(q)萼[4,1,2,3]
q.rotate(1)
print(q)萼[3,4,1,2]
同前
q=collection.deque([1,2,3,4])
q.rotate(-1)
print(q)萼[2,3,4,1]
q.rotate(-1)
print(q)萼[3,4,1,2]
スレッドの安全については、collection.dequeのappnd()、pop()などのソースコードを見ることによって知ることができます。彼らはすべて原子操作なので、GIL保護下のスレッドの安全方法です。
static PyObject*
deque_apped(dequeobject*deque,PyObject*item)
Py_INCREF(item)
if(deque_)apped_internal(deque,item,deque->maxlen)<0)
return NULL
Py_RETURN_NONE;
)
dis法により,appndは原子操作(1行のバイトコード)であることが分かる。

このように、collection.dequeは、キューを容易に実現することができるデータ構造であり、スレッドの安全特性を有し、高性能である。
queue.Que&asyncico.Que
queue.Queとasyncico.Queはともに多生産者、多消費者をサポートする列であり、collection.dequeに基づいて、Que(FIFOキュー)、PriorityQue(優先順位列)、LifoQue(LIFOキュー)を提供しており、インタフェースの面も同じです。
違いはqueue.Queがマルチスレッドのシーンに適用され、asyncico.Queが協働シーンでの通信に適用されます。asyncicoの加成によって、queue.Que下のブロックインターフェースはasyncico.Queの中で協働対象に戻る形で実行されます。具体的な違いは以下の通りです。
 
queue.Que
asyncico.Que
紹介する
キューを同期
asyncico行列
スレッドの安全
はい、
いいえ、
タイムアウト機構
timeoutパラメータで実現
asyncico.wait_を通じてfor()方法実現
qsize()
事前に見積もったキュー長(Qsizeを取得すると次の操作までの間に、queueが他のスレッドによって修正される可能性があり、Qsizeサイズが変化する)
正確なキュー長さ(単一スレッドですので、他のスレッドによってはqueueは修正されません)
put()/set()
put(item、block=True、timeout=None)は、blockがTrueであるかどうかを設定することによって、putとset方法をブロックするかどうかを設定することができ、ブロック動作の最大時間の長さを設定することができます。blockはFalseの時の挙動とput_です。nowait()方法が一致します。
put()メソッドは協働対象に戻りますので、ブロックパラメータとtimeoutパラメータがありません。閉塞しない方法が必要なら、put_を使ってもいいです。nowait()は、閉塞方法に対してタイムアウトを適用する必要があれば、cooutine asyncico.wait_を使用することができます。for()
multiprocessing.Que
multiprocessingはQue、SimpleQue、Joinable Queの三つの列を提供します。

multiprocessing.Queはスレッドの安全であり、プロセスの安全であり、queue.Queに相当するマルチプロセスのクローン版です。threading.Queに似ています。multipurcessingn.Queはputとget操作をサポートしています。下の構造はmultiprocessing.Pipeです。
multiprocessings.Que底部はPipeに基づいて構築されていますが、データ転送時は直接Pipeに書き込むのではなく、ローカルのbufferに書き込んで、一つのfeederスレッドを通じて最下層のPipeに書き込みます。タイムアウト制御とブロックではないput/getを実現するために、Queはjoin_を提供しています。thread、cancel_ジョン.thread、close関数はfeederの行為を制御して、close関数はfeederスレッド、join_を閉じるために使います。threadはjoin feederスレッド、cancel_に使われます。ジョン.threadはプロセス終了時に自動的にjoin feederスレッドを制御しないために、cancel_を使用します。ジョン.threadは、一部のデータがfeederにPipeに書き込まれていないため、データが失われる可能性があります。
threadingn.Queとは違って、multiprocessing.Queはデフォルトではjon()とtask_をサポートしていません。done操作では、この二つのサポートはmp.Joinable Queオブジェクトを使用する必要があります。
SimpleQueは簡単な列で、Queの中のbufferをなくしました。Queを使う問題はなくなりましたが、putとget方法は全部ふさがっていて、タイムアウトのコントロールがありません。
締め括りをつける
比較によって、上述の4つの構造はキューを実現したが、用途はそれぞれ偏りがあり、collection.dequeはデータ構造のレベルでキューを実現したが、アプリケーションシーンに対するサポートはなく、基礎的なデータ構造と見なされてもよいことがわかった。queueモジュールは多生産スレッド、多消費スレッドに向けたキューを実現し、asyncico.queueモジュールは多生産協働程、多消費協程に向けたキューを実現しました。multiprocessing.queueモジュールは多生産プロセス、多消費プロセスに向けたキューを実現しました。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。