私は何のためにStacklessのPythonのを使うのでしょうか?
-
19-09-2019 - |
質問
StacklessのPythonのに関連する多くの質問があります。しかし、この私の質問に答えるどれも、私は考えて(私を修正していない場合は間違って - してください!)。それについていくつかの話題を知っているので、私は好奇心のすべての時間があります。私は何のためにスタックレスを使うのでしょうか?どのようにそれはCPythonのより良いですか?
はい、それ持って何も操作がブロックされていないとすぐに限り、多くの軽量スレッドを作成できるように、グリーンスレッド(スタックレス)(Rubyのスレッドのようなものを?)。以下のため、この偉大な何ですか?それが持っている他のどのような機能私はCPythonの上を使用したい?
解決
それはあなたの同時実行の膨大な量の作業を行うことができます。誰もまともには10万システムスレッドを作成しますが、この使用してスタックレスを行うことができます。
この記事のテストは、PythonとGoogleゴー(新しいプログラミング言語)の両方で10万タスクレットを作成し、ちょうどそれをやって:<のhref = "http://dalkescientific.com/writings/diary/archive/2009/11 /15/100000_tasklets.html」のrel = "noreferrer"> http://dalkescientific.com/writings/diary/archive/2009/11/15/100000_tasklets.html の
驚くべきことに、Googleの移動は、ネイティブコードにコンパイルされ、彼らはコルーチン実装を宣伝されている場合でも、Pythonはまだ勝っています。
スタックレスはマップを実装するための良いでしょう/あなたが入力データに応じた減速機の非常に大きな数を持つことができるアルゴリズムを、減らすます。
他のヒント
StacklessのPythonの主な利点は、非常に軽量コルーチンのサポートです。 CPythonのは、ネイティブにコルーチンをサポートしていません(私は誰かがコメントで発電機ベースのハックを投稿することを期待している)ので、スタックレスはあなたがコルーチンから利益を得るという問題があるCPythonの上の明らかな改善です。
私はあなたのプログラム内で実行されている多くの並行タスクを持っているとき、彼らは優れてメインエリアがあると思います。例としては、彼らのAIのためのループスクリプト、または作成するのが遅いページと多くのクライアントにサービスを提供しているWebサーバーを実行するゲームエンティティであるかもしれない。
あなたはまだしかし、共有データについての同時実行性の正しさを持つ典型的な問題の多くを持っていますが、確定的なタスク切り替えを使用すると、正確に制御が転送される場所を知っているので、共有する正確なポイントを知っているので、それが簡単に安全なコードを書くことができます状態が最新でなければなりません。
Thirlerはすでにスタックレスはイブオンラインで使用されたことを述べました。
:ということ、覚えておいてください(..)スタックレスタスクは、次に自分自身で実行するメインプログラムをオフに分割することができる小さなタスク、タスクレット、に分離するようにすることによって、これにさらにひねりを追加します。これは、例えば、ファイア・アンド・フォーゲットタスクのため、電子メールを送信オフ、またはイベントをディスパッチのように、またはIO操作に使用することができますネットワークパケットを送受信します。他のものは、ゲームループの実行を継続しながら、一つのタスクレットは、ネットワークからのパケットを待つ。
これは、スレッドのようないくつかの方法であるが、明示的に非プリエンプティブと予定されているので、同期を持つ少数の問題があります。また、タスクレットの切り替えはスレッドの切り替えよりもはるかに高速で、スレッドの数が厳しく、コンピュータのハードウェアによって制限されているのに対し、あなたはアクティブなタスクレットの膨大な数を持つことができます。
(ここではのからこの引用を得た)。
がPyCon 2009年が与えられた<のhref = "http://blip.tv/pycon-us-videos-2009-2010-2011/stackless-python-in-eve-pt-2-1959372" のrel = 「nofollowをnoreferrer」>非常に興味深い話を、なぜ、どのようにスタックレスがCCPのゲームで使用されます。
記述するまた、非常に良い<のhref = "http://www.grant-olson.net/projects/1970/01/02/introduction-to-stackless-python.html" のrel = "nofollowをnoreferrerがありますスタックレスは、あなたのアプリケーションに適したソリューションである理由「>入門材料で、記載されています。 (それはやや古いかもしれないが、私はそれは読む価値があると思います)。
EVEOnlineは、主にStacklessのPythonでプログラムされています。彼らはそれの使用に関するいくつかのdevのブログを持っています。高性能コンピューティングのために非常に有用であるようです。
、私は非常に-同時ネットワークアプリケーションを実装するためGreenletを使用しています。高性能スマートプロキシ、マシンの膨大な数の上にコマンドを配布するための高速なシステム、およびデータベースのトンを行うアプリケーションでは、約1の比率で(書き込み、読み込み:リンデンラボはの方にそれを入れているユースケースのいくつかはあります:非常に重い-書き込み、それは)データベースが戻るのを待っているそのほとんどの時間を費やしていますし、内部Webデータ用のWebクローラ型-ものである2、。基本的にはネットワークの多くをしなければならないことを期待しています任意のアプリがI / Oはbajillion軽量スレッドを作成することができることから利益を得るであろう。万の接続されたクライアントは、私には大きな問題のように見えるしていません。
スタックレスまたはGreenletはいえ、実際には完全なソリューションではありません。彼らは非常に低レベルであり、あなたは彼らの最大限にそれらを使用してそれらを使用してアプリケーションを構築するためにmonkeyworkの多くを行う必要があるとしています。私はアプリケーションを書くことはそんなに簡単にそれであり、具体的ので、Greenletの上ネットワーキングおよびスケジューリング層を提供するライブラリを維持するので、私はこれを知っています。これらの束が存在することになります。私はEventletを維持するだけでなく、同意、キラル、そしておそらくいくつかのより多くのは、私が知らないことがあります。
あなたは私が書いたもののような音を書きたいアプリの並べ替えは、これらのライブラリのいずれかを検討してください。 Greenlet対スタックレスの選択は、最高のあなたが何をしたいのニーズに合ったものをライブラリ決めるよりもやや小さいが重要です。
グリーンスレッドのための基本的な有用性は、私はそれを参照してください方法は、あなたが高遅延操作を行うオブジェクトを大量に持っていたシステムを実装することです。具体例では、他のマシンと通信することになる。
def Run():
# Do stuff
request_information() # This call might block
# Proceed doing more stuff
スレッドを使用すると、自然に上記のコードを書いてみましょう、しかし、オブジェクトの数が十分に大きい場合、スレッドは単に適切に実行することはできません。しかし、あなたは本当に大量にでものための緑のスレッドを使用することができます。上記request_information()
は、他の仕事が待っているいくつかのスケジューラにスイッチアウトし、後で返すことができます。あなたは、彼らがスレッドを使用せずにのすぐ返すかのような機能がを「ブロッキング」を呼び出すことができることのすべての利点を取得します。
これは明らかに、分散コンピューティングのあらゆる種類のために非常に便利です。
複数のコアがロックの待機軽減するためにも興味深います:
def Run():
# Do some calculations
green_lock(the_foo)
# Do some more calculations
green_lock
機能は基本的にロックを取得し、それがオブジェクトを使用して他のコアのために失敗した場合にだけ、メインスケジューラにスイッチアウトしようとしていました。
ここでも、グリーンスレッドは、コードが自然に書かれており、まだ十分に機能することを可能にする、ブロッキング軽減するために使用されている。