スレッドをPythonで[定休日]
-
19-09-2019 - |
質問
そのモジュールを書き込むのに使用されるマルチスレッドの応用Python?知識の基本的な並行処理機構によるもの Stackless Python, もう、それぞれの強み-弱み?
解決
順が複雑化:
をご利用 threadingモジュール
メリット:
- でも簡単に機能(任意の呼び出し可能オブジェクト実) 独自のねじになります。
- 共有データがない場合で行ってくださいますようお願いロックがずっと簡単です:) 少なくとも簡単です。
連結:
- 記 によるJuergen Pythonのスレッドで実際に同時にアクセス状態では、通訳者は通訳はあまり大きなロックは、悪名高 グローバルロックの通訳.) とする実際にはそのスレッド用I/Oの結合作業(ネットワークへの書き込みディスク)などを用いて並行計算である。
をご利用 マルチプロセ モジュール
の簡単な利用の場合はこの姿を threading
を除く各タスクは、その処理は、独自のねじになります。(ほとんどの方は文字通り:しの場合 Eliの例, 交換 threading
と multiprocessing
, Thread
, は、 Process
, は、 Queue
(モジュール) multiprocessing.Queue
, はずで行けます。)
メリット:
- 実際の並行処理のためのすべてのタスク(グローバルロックの通訳).
- スケールに複数のプロセッサでも規模の複数の 機械.
連結:
- プロセスは以下のスレッド)。
- データの共有というプロセスはtrickierよりもスレッド)。
- メモリにはない暗黙のうちに共有します。また明示的に共有でき漬け変、送り返し、安定性を確保します。これは、より安全でも硬くなっていきます。した場合、その事項をますますのPython開発者の見を押し上げられるという。)
利用イベントモデルなど ねじれ
メリット:
- きめ細かな制御を優先、何を実行します。
連結:
- でも良い図書館、非同期プログラミングは、通常どのようにネジ付きプログラミング、ハードの両面から何を求めているかを理解して開いてしまう恐れが何らかのデバッグ実際に起きている。
に すべての 例っといての理解の問題の多く関わる複合加工、具体的には、難しい問題の共有するにはどうすればよいデータと事ができます。何らかの理由により、あなたがわからない。時に、どのようにロックを使用及び条件がありましたらご記入下さいを開始。複合加工のコードは微妙なとgotchasとって良い理解の概念をする前に開始されます。
他のヒント
あなたはすでに「偽のスレッド」外部フレームワークのすべての方法から、回答の公正な様々なを得てきましたが、私は誰も言及さQueue.Queue
を見てきました - 。CPythonのスレッドの「秘密のソースを」
拡大するには:限り、あなたは純粋なPythonのCPU-重い処理を(その場合には、あなたがmultiprocessing
を必要とオーバーラップする必要はありませんとして - しかし、それはあまりにも、独自のQueue
実装が付属して、いくつかの必要な注意を持つことができますので、私は;-)与えている一般的なアドバイスを適用し、Pythonのビルトイン行いますthreading
...しかし、それはあなたがそれを使用する場合より良いそれを行います。のadvisedly の、例えば、次のように。
共有メモリ、マルチプロセッシング対スレッドのはずの主なプラスを「忘れて」 - それがうまく動作しない、それは決して決して、持っていない、うまくスケールしません。他のすべてのために、そのリソースを担当するのシングルのスレッドを作る - のみのあなたは、サブスレッドを生成し、その後変更されたことがない前に一度、の設定されているデータ構造に共有メモリを使用します、およびQueue
介してそのスレッドと通信します。
あなたが正常にロックによって保護することだと思うだろう、すべてのリソースに特化したスレッドを捧げる:可変データ構造または凝集グループその、外部プロセスへの接続(DB、XMLRPCサーバなど)、外部ファイル、必要なときなど、のないの産卵スレッドと、またはスレッド - などなど汎用持っているか、その種類の専用リソースを必要としないタスクのために行く小さなスレッドプールを取得します。オーバーヘッドを切り替えることはあなたを圧倒します。
二つのスレッド間の通信がQueue.Queue
経由で常にある - (私はHaskellで除き、ノー生産に値するの実装を知っているために有望であるトランザクショナル・メモリのほかに、しかし)メッセージパッシングの形式、マルチプロセッシングのための唯一のまともな基盤。
単一のリソース(またはリソースの小さな凝集セット)を管理する各専用スレッドは、特定Queue.Queueインスタンスの要求をリッスン。プール内のスレッドは、単一の共有Queue.Queueを待つ(キューがしっかりスレッドセーフであるとがは、この中にあなたを失敗することはありません)。
ただ、いくつかのキュー(共有または専用)の要求をキューする必要があります。スレッドの結果を待たずにそれを行う、と上に移動します。応答または確認を進めるために不可欠であるとき、結局、最終的に彼らはちょうど作っQueue.Queueのインスタンスとリクエストキューペア(リクエスト、receivingqueue)に対する結果または確認を必要とし、DOスレッドは、彼らが(待ち取得します)そのreceivingqueueから。あなたは(ツイストのdeferred
sはところで、構造化された応答のこの種を組織で素晴らしいです!)エラー応答だけでなく、実際の回答や確認を取得する準備が整いましたことを確認してください。
また、いずれかのスレッドで使用することができますが、1時間(一部DBAPIのcompoentsとDB接続、他の人とカーソルなど)で複数のスレッド間で共有することはないリソースの「公園」のインスタンスにキューを使用することができます - このあなたはより多くのプール(共有キューからapppropriateキューからそのリソースを取得するキューイング可能リソースを必要とする要求を取得し、プールのスレッド、必要に応じてなどなど、待機中)の賛成で、専用のスレッド要件を緩和することができます。
ツイストが実際に(場合によってはまたはスクエアダンス)、のDeferredにだけでなく、おかげでこのメヌエットを整理するための良い方法ですが、その音、固体、高度にスケーラブルな基本アーキテクチャの:あなたがスレッドを使用するには、物事を手配したり真に保証のみのサブプロセス、ほとんどのものをやっている間は、通常、単一のイベント駆動型スレッドでスレッド価値があると考えられます。
しかし、私はツイストは皆のためではない実現 - 「専用またはプールリソース、wazooまでキューを使用し、さらに高度な、そのようなセマフォや条件として、任意の同期手順をグイドは禁止、ロックを必要とするか、何もしません"アプローチは、まだあなただけの非同期イベント駆動型の方法論の周りにあなたの頭をラップすることができない場合でも、使用することができ、さらによりをお届けします私が今までにつまずいてきた他の広く適用可能なスレッドのアプローチよりも信頼性とパフォーマンスます。
それはあなたが何をしようとしているかに依存しますが、それは任意の関数を取り、ちょうど別のスレッドでそれを実行することが本当に簡単になりますので、私はちょうど標準ライブラリにthreading
モジュールを使用する部分です。
from threading import Thread
def f():
...
def g(arg1, arg2, arg3=None):
....
Thread(target=f).start()
Thread(target=g, args=[5, 6], kwargs={"arg3": 12}).start()
のように。私はよくQueue
モジュールが提供する同期キューを使用してプロデューサ/コンシューマを設定している。
from Queue import Queue
from threading import Thread
q = Queue()
def consumer():
while True:
print sum(q.get())
def producer(data_source):
for line in data_source:
q.put( map(int, line.split()) )
Thread(target=producer, args=[SOME_INPUT_FILE_OR_SOMETHING]).start()
for i in range(10):
Thread(target=consumer).start()
Kamaelia はpythonの枠組み構築の用途に多くの通信プロセス
こちらの映像からの参加者の2009年.から始める必要がありま比較Kamaeliaる ねじれ や 並列Python そしてこの手のKamaelia.
(出典: kamaelia.org) Kamaelia-並行処理して有用な、楽しい
にKamaeliaを構築するシステム 簡単な部品のことを語り合う.この速度の開発-大規模エイズの維持という意味にお の構築を自然兼職の状況ソフトウェア.でのホームページ<url>で公開されます。 他の 開発を含め、簡単にご利用いただけます。なのはもちろんのこと、楽しみ:)
どのようなシステム?ネットワークサーバ、クライアント、デスクトップアプリ、pygameに基づくゲーム、トランスコードシステムのパイプライン、デジタルテレビシステム、迷惑メールeradicators、教育ツール、および公正な金額となりま)
簡単に並行処理とKamaelia-1 (59:08)
簡単に並行処理とKamaelia-Part2 (18:15)
に関するKamaelia、その答えは、上記ていませんの利益をこちらです。Kamaeliaのアプローチを提供統一されたインタフェースは、実践的な対応のスレッド発電機-プロセスを単一のシステムのための並行処理.
基本的にこの比喩を走行中のものであるinboxes、outboxes.送信するメッセージoutboxes、有線とメッセージフローからoutboxesにinboxes.この比喩/APIは同じかどうかだけを利用発電機、スレッドまたはプロセス、又は言語の他のシステム。
の"完璧なもの"の部分による統語的糖れていないとして追加されているinboxesとoutboxesがない(下のディスカッション)により安全/ユーザビリティのシステム。
をプロデューサーの消費者とえば、裸のスレッドは、上記のことがこのKamaelia:
Pipeline(Producer(), Consumer() )
この例ではターからのこれらのネジ付き部品又はその他の間からご利用の視点はbaseclassのために、コンポーネントに対する発生部品を用いてコミュニケーションを取ントネジ付き部品を使用します。キュープロセスを用います。る事に成功しました。
その理由をこのアプローチにもなっているので作りにくいハードデバッグします。ねじ-や共有メモリ並行処理しますが、一番問題に直面しているのは偶発的に破れた共有データの更新をした。を用いメッセージ通信に対する 一つ クラスのバグ修正
ご利用の場合は裸のスレッドとロックを随所にこだ一般的に働くことを前提とするコードを記述すなくすことはできません。しかしすべての目指すことで非常に珍しいことが起こると思います。によるラッピング、ロッキング行動が一つの場所をより簡単に、ものがどこで間違っています。(コンテキストハンドラがないと誤ェントのコンテキスト外のハンドラ)
でないことが明らかな場合のコードで書き込まれるとのメッセージ送受信や共有スタイルはなぜKamaeliaもシンプルなソフトウェア取引メモリ(STM)、本当に綺麗アルコビーチの名前でバージョン管理のための変数の家もチェックを変更してコミットす。だぶつかり合いを繰り返すしかありません。
関連リンク:
それでは、みなさん、とするのに便利な答えです。FWIWの理由Kamaeliaのセットアップに並行処理でより安全&使いやpythonにおけるシステムの尾太をまとめたものです。(ieのバケットの部品
内容を理解することができなぜその他のKamaelia回答したmodded、でも私の使っているうる、アルツハイマー病、次のように答えた。筆者としてのKamaeliaではあの熱気がこれかの関連コンテンツ:-)
ことになる私のようにしてください点に注意するこの答えは定義によって偏ったのだKamaeliaことを目的としてみて、組み込みスクリプトで何がIMOにベストプラクティスっこう少しシステムとして開催される作品です。(場合には適さないスタックオーバーフロー、申し訳ありません-今回が初めてこのフォーラム:-)
私はまったくのスレッドを使用していた場合、私は、StacklessのPythonののマイクロスレッド(タスクレット)を使用することになります。
全体のオンラインゲーム(massivlyマルチプレイ)がスタックレスとそのマルチスレッド原理を中心に構築されて - 。元はただのゲームのmassivlyマルチプロパティに遅くすることですので、
はCPythonのスレッドが広く推奨されていません。グローバルインタプリタロック - - 実行の多くの部分のためのスレッドシリアライズする一つの理由は、GILです。私の実務経験は、高速にアプリケーションをこのように作成することは本当に困難であること、です。一つのコアを有する(入力のために多くの待機いくつかのパフォーマンスが可能昇圧作っておく必要があり)
- すべてのスレッドと遅いが、私の例コーディング。 可能な場合は、はCPythonでは、むしろ別々のプロセスを使用します。
、あなたは発電機を使用してを試すことができます偽のコルーチンにを。それはおそらく、関連する作業の中では、最も効率的ではありませんが、コルーチンはあなたの非常に細かい制御を提供していますかの協同組合のプリエンプティブマルチタスクではなく、マルチタスクあなたが他の場所で見つけることができます。
あなたが見つける一つの利点は、協同マルチタスキングを使用した場合で、大規模、あなたはロックやミューテックスを必要としないということですが、私にとってより重要な利点は、「スレッド」との間にほぼゼロスイッチング速度でした。もちろん、StacklessのPythonは、同様にそのための非常に良いと言われています。それはPythonのではないのHAVE をした場合、その後Erlangのは、あります。
おそらく、協同組合マルチタスクでの最大の欠点は、I / Oをブロックするための回避策の一般的な欠如です。そして、偽造コルーチンに、あなたも、あなたがスレッド内のスタックの最上位レベル以外のものから「スレッド」を切り替えることができない問題が発生します。
あなたが偽のコルーチンと少しでも複雑なアプリケーションを作った後は、あなたが本当にOSレベルでのプロセススケジューリングに入る仕事に感謝し始めます。