大量の非同期ioを必要とするアプリには、Twistedを幅広く使用しています。代わりにCPUにバインドされているケースがいくつかあります。そのために、処理を実行するプロセスのプールを生成し、複数のサーバー間でこれらを管理するためのシステムを用意しています。これらはすべてTwistedで行われます。よく働く。問題は、新しいチームメンバーをスピードアップすることが難しいことです。 Twistedで非同期コードを書くには、ほぼ垂直の学習曲線が必要です。まるで人間がそのように自然に考えていないかのようです。
おそらく、混合アプローチを検討しています。たぶん、xmlrpcサーバーパーツとプロセス管理をTwistedに保持し、少なくとも同期が取れているように見えるが、そうではない他のコードをコードに実装することもできます。それから、私は暗黙よりも明示を好むので、これについてもう少し考えなければなりません。とにかくグリーンレットに-それはどれくらいうまくいきますか? Stacklessがあり、私のGallenteanアバターからわかるように、CCPのフラッグシップEVE Onlineゲームでの使用が非常に成功していることはよく知っています。 Eventletまたはgeventはどうですか?まあ今のところ、EventletだけがTwistedで動作します。ただし、geventは、純粋なpython実装ではなく、代わりにlibeventに依存しているため、より高速であると主張しています。また、特異性と欠陥が少ないと主張しています。 gevent 私の知る限り1人の男です。これにより、いくらか不安になりますが、すべての優れたプロジェクトはこのように始まります...それから PyPy -まだそのプロジェクトについて読み終えていません-たった今見ましたこのスレッドで: Stacklessの欠点 。
とても混乱しています-一体何をすべきかと思っています-Eventletがおそらく最善の策であるように聞こえますが、本当に十分に安定していますか?誰もがそれを使った経験がありますか?代わりにStacklessを使用する必要があります。Twistedもそうであるように、それは実績があり実績のあるテクノロジーであり、それらはうまく連携します。しかし、私はこれを行うためにPythonの別のバージョンを用意する必要があるのを嫌います。何をすべきか...
このやや不愉快なブログエントリは私のために頭に釘を打った: Asynchronous IO for Grownups TwistedがJavaについて私にコメントJavaは通常、スレッディングマインドセットのどこにでもありますが、それでも、このモンキーパッチは本当にそのように機能する場合、すごいです。すごい!
あなたはチェックアウトしたいかもしれません:
Stackletにはタスクレットを認識しない標準ライブラリが同梱されているため、Eventletとgeventは実際にはStacklessに相当しません。 Stacklessのソケット の実装がありますが、 gevent.monkey ほど包括的なものはありません。 CCPは基本的なスタックレスを使用せず、スタックレスI/Oと呼ばれるものを持っています。これはAFAIKがウィンドウのみであり、オープンソース化されたことはありません(?)。
Eventletとgeventの両方を、greenletではなくStacklessで実行するようにできます。ある時点で GSoCプロジェクト としてこれを試みましたが、学生を見つけることができませんでした。
あなたの質問の一部に答える- http://speed.pypy.org を見ると、PyPyの上にねじれたを使用していることがわかります速度を向上させます。これはもちろんワークロードに依存しますが、おそらくチェックする価値があります。
乾杯、
フィジャル
Eventletとrepoze.bfgの上に少しリアルタイムのWebアプリを構築しました(Djangoかなり前に諦めました)。Eventletとmonkeyのパッチはちょうど正しいとわかりましたテッドが言うように簡単です。