Tornadoを使用する場合、Twisted / Cyclone / GEvent /その他を使用する場合[終了]


181

これらのフレームワーク/ライブラリのどれが、最新のマルチユーザーWebアプリケーションを構築するための最良の選択でしょうか?簡単にスケーリングできる非同期ウェブサーバーが欲しいです。最高のパフォーマンス / スケーラビリティ / 最も便利なフレームワークを提供するソリューションはどれですか(使いやすさと開発のしやすさの点で)?

優れた機能(WebSocket、RPC、ストリーミングなど)を提供できればすばらしいと思います。

各ソリューションの長所と短所は何ですか?


これらのフレームワークの1つである必要がありますか?あなたの計画は何ですか、そしてDjangoやPylonsなどのようなものがうまくいきますか
Joe Doherty、

いいえ、実際にはそうではありませんが、非同期で、WebSocketが適切にサポートされれば私は気に入っています。質問も更新しました。ありがとうございました。
Wojciech Danilo 2012

3
広義の質問ですね。
Jean-Paul Calderone

どちらを選択するかは、使用するライブラリによって異なります。あなたのライブラリ-あなたが解決したいタスクで。
Nikolay Fominyh

1
はい、それは広いですが、おそらく不快です。これらのライブラリが本番環境で使用されており、毎日それらの一部を使用している誰かが、それらが何のために優れているか、何が欠けているかなどを知ることができるかどうか疑問に思っています。アウトバーンやサイクロンについて話すとき、減価したと考えられる?あるいは、mmaybe AutobahnとCycloneは生産準備が整っておらず、その保守性に問題がありますか?それとも、トルネードのデザインがよりモダンで、将来はおそらく輝かしく素晴らしいものになるでしょう。
Wojciech Danilo 2012

回答:


226

Djangoは、迅速な開発とクリーンで実用的な設計を促進する高レベルのPython Webフレームワークですeコマースサイトに似たものを構築する場合は、おそらくDjangoを使用する必要があります。それはあなたの仕事を素早く終わらせるでしょう。テクノロジーの選択肢が多すぎることを心配する必要はありません。テンプレートエンジンからORMまで、必要なものがすべて揃っています。アプリの構成方法については少し意見が分かれるでしょう。また、他のすべてのライブラリの中で最も強力なコミュニティを備えているため、簡単にヘルプを利用できます。

Flaskは、Werkzeug、Jinja 2、善意に基づいたPythonのマイクロフレームワークです注意-「マイクロフレームワーク」は誤解を招く可能性があります。これは、Flaskが中途半端なライブラリであることを意味するものではありません。つまり、フラスコのコアは非常にシンプルです。Djangoとは異なり、Djangoはテクノロジーの決定を行いません。気に入ったテンプレートエンジンやORMを自由に選択できます。Jinjaテンプレートエンジンはデフォルトで付属していますが、いつでも自由に選択できます。私の知る限り、FlaskはAPIエンドポイント(RESTfulサービス)の作成に役立ちます。

Twistedは、Pythonで記述されたイベント駆動型のネットワークエンジンですこれは高性能エンジンです。その速度の主な理由は、遅延と呼ばれるものです。Twistedはdeferredの上に構築されています。遅延について知らないあなたのために、それは非同期アーキテクチャで達成されるメカニズムです。Twistedは非常に高速です。ただし、従来のWebアプリケーションの作成には適していません。低レベルのネットワーキング関連のものを実行したい場合は、twistedが最適です。

" Tornadoは、元はFriendFeedで開発されたPython Webフレームワークと非同期ネットワークライブラリです。ノンブロッキングネットワークI / Oを使用することにより、Tornadoは数万のオープン接続にスケーリングできるため、ロングポーリング、WebSocket、その他のアプリケーションに最適です。それは、「ユーザーごとに長寿命の接続が必要です。トルネードはDjangoとFlaskの間のどこかにあります。DjangoまたはFlaskで何かを記述したいが、より優れたパフォーマンスが必要な場合は、Tornadoを選択できます。正しく設計されていれば、C10kの問題を非常にうまく処理できます。

Cycloneは、Tornado APIをTwistedプロトコルとして実装するPython用のWebサーバーフレームワークですでは、Twistedとほぼ同じ性能でありながら、従来のWebアプリケーションを簡単に作成できるものが必要な場合はどうでしょうか。サイクロンによろしく。竜巻よりサイクロンの方がいいと思います。トルネードによく似たAPIを持っています。実際のところ、これは竜巻の分岐点です。しかし問題は、それが比較的小さなコミュニティを持っていることです。Alexandre Fioriがリポジトリの唯一の主要なコミッターです。

Pyramidは、一般的なオープンソースのPython Webアプリケーション開発フレームワークです。その主な目標は、Python開発者がWebアプリケーションを簡単に作成できるようにすることです。」私はPyramidを実際には使用していませんが、ドキュメントを読みました。私の理解から、PyramidはFlaskに非常に似ており、Flaskが適切と思われる場所であればどこでもPyramidを使用できると思います。逆も同様です。

編集:他のフレームワークをレビューするリクエストは大歓迎です!

出典:http : //dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html


1
Djangoは私の好みのフレームワークです。そのドキュメントは非常に優れており、ORMは簡単です。Southはデータベーススキーマの移行に最適です....しかし、質問にはこれが含まれていました。「簡単にスケーリングできる非同期Webサーバーが欲しいです。」Djangoは、非同期ではなく、従来のリクエスト+レスポンスサイト用に作成されました。
guettli 2013年

1
ピラミッドについて書くことができますか?
Fizer Khan、2014

5
@FizerKhan:あなたのリクエストに従って、私は答えを更新しました。すみません、とても時間がかかりました。ピラミッドを使用する時間がありませんでした。しかし、私はドキュメントを読みました。
dhilipsiva

1
さらに、トルネードが使用するシングルスレッド環境はバグが発生しやすくなります。単一のAPIエンドポイントのコードを遅くすると、すべてのエンドポイントで問題が発生しやすくなります。
Abel Molina

1
cherrypyについてコメントしていただけますか?
Stavros Avramidis 2017年

60

これは明らかにやや偏った回答ですが、それは間違った回答と同じではありません。常にTwistedを使用する必要があります。私は以前に同様の質問に答えたことがありますが、あなたの質問はまったく同じではないので、いくつかの理由があります:

"最高のパフォーマンス"

Twistedは、speed.twistedmatrix.com Webサイトで継続的にパフォーマンスを監視しています。また、PyPyの同様のサイト監視された最初のプロジェクトの1つであり、Pythonの高性能アプリケーションに関係する誰もがランタイムでTwistedの優れたパフォーマンスを保証しました。

「スケーラビリティ」

私の知る限りでは、リストされているフレームワークには、自動スケーリングのサポートが組み込まれていません。これらはすべて通信フレームワークであるため、スケーリングノード間で通信するための作業を行う必要があります。ただし、Twistedには、ローカルマルチプロセッシングの組み込みサポートという利点があります。公平に言えば、トルネード用のサードパーティ製アドオンがあり、同じことを実行できます。最近のリリースでは、Twistedはコア間で作業を共有する方法の数を増やす機能追加しており、その領域で作業が進行中です。Twistedには、よく統合された「ネイティブ」 RPCプロトコルがいくつかあり、これにより、追求するスケーリングイディオムに対応する構築キットが提供されます。

"一番便利"

多くの人がTwistedをとても便利だと思っているようですそれらの多くがそれを拡張し、それらの拡張機能をあなたが利用できるようにしたほどです。

「機能性」

すぐに使えるTwistedには以下が含まれます。

この最後の部門では、少なくともTwistedは組み​​込み機能の明らかな勝者のようです。そして、これらすべてが、2メガバイト強のパッケージで!


6
TwistedではなくGEventを使用しないと言う人が多いのはなぜですか。
remdezx

1
(、そのコールバックアーキテクチャの)ツイストを使用して、大きなアプリケーションを維持することが困難であることを伝える多くの人々があります。stackoverflow.com/questions/3048012/... でしょうが、それはツイストベースの使用geventまたはgeventに良いことではありませんか?
Wojciech Danilo

8
@remdezx質問については、2つの理由があります。1つは、並行プログラミングが理解しづらいため、Twistedを理解するのが難しいと人々が感じることです。表面的には理解しやすいため、GEventに切り替えます。同時実行性がない限り、すべてが期待どおりに機能します。もう1つの理由は、イベント駆動型I / Oのパフォーマンス上の利点を得るために、イベント駆動型APIを使用して記述されていないコードをGEventに移植するほうが作業がはるかに少ないことです。コードがあまり状態を共有しない場合、そのようなポートはおそらく正常に動作します。
Glyph

1
@Glyph、あなたは同時実行性について話していますが、GeventもTwistedも同時実行性をサポートしていません(もちろん、geventでマルチプロセッシングを使用し、実際のスレッドのプールと各スレッドでグリーンレットのプールを使用できます-これは私とTwistedプラグインを使用してまったく同じことを実行できます-複数のツイストされたインスタンスを隣り合わせで実行します)。しかし、Twistedはgevent以上のものを与えますか?gevent / twistedのインスタンスが複数ある場合でも、明示的なioコールバックがなければ、geventの方が簡単に理解できます。何か不足していますか?
Wojciech Danilo 2013年

2
@ danilo2はい、少なくとも1つ欠けています:)。具体的には、「並行性」という言葉が「複数のCPUでの並行並列実行」を意味すると誤解している。Twistedは非同期(コールバックベース)I / Oを介して同時I / Oスケジューリングを行うことができます。GEventは、マイクロスレッドスケジューラを介して同時I / Oスケジューリングを実行できます。Twistedでは、を使用してspawnProcess、このI / OスケジューリングをCPUスケジューリングにも変換できます。
Glyph

48

@Glyphレスポンスが好きです。Twistedは非常に包括的で豊富なPythonフレームワークです。ツイステッドとトルネードは非常によく似たデザインです。そして、私はこのデザインがとても好きです:

  • これは速い
  • わかりやすい
  • 拡張しやすい
  • c-extensionsは必要ありません
  • PyPyで動作します。

しかし、私は私が好んで最近人気を得ているトルネードを強調したいと思います。トルネードは、Twistedと同様に、コールバックスタイルのプログラミングを使用しますが、tornado.gen.enginetwisted.internet.inlineCallbacksTwistedで)を使用してインライン化できます。

コードベース

最高のコメントは、http://cyclone.ioサイトからです。サイクロンは、次の理由でツイステッドとトルネードを混合しようとします。

Twistedは、一般公開されている非ブロッキングI / O用の最も成熟したライブラリの1つです。トルネードは、FriendFeedのWebサーバーのオープンソースバージョンであり、Pythonで最も人気があり高速なWebサーバーの1つであり、Webアプリケーションを構築するための非常に適切なAPIを備えています。

アイデアは、トルネードのエレガントでわかりやすいAPIをTwistedのイベントループにブリッジし、サポートされている膨大な数のプロトコルを有効にすることです。

しかし、2011年tornado.platform.twistedには、同様の機能をもたらすものが出ていました。

パフォーマンス

竜巻ははるかに優れた性能を持っています。また、PyPyとシームレスに連携し、大きな利益を得ることができます。

スケーラビリティ

ツイステッドと同じ。Tornadoにはtornado.process、その上に多数のRPCサービスが実装されています。

機能性

トルネードベースのパッケージは71ありますが、ツイスト148とGevent 48です。しかし、注意深く調べてパッケージのアップロード時間の中央値を計算すると、Twistedが最も古く、GeventとTornadoが最も新しいことがわかります。さらに、トルネードでTwisted用に作成されたコードtornado.platform.twisted実行できるモジュールがあります。

概要

Tornadoを使用すると、Twistedのコードを使用できます。コードをひねるだけのサイクロンを使用する必要はありません(コードがより乱雑になります)。

2014年に関しては、トルネードは広く受け入れられているデフォルトの非同期フレームワークであり、python2とpython3の両方で動作します。また、最新バージョン4.xは、https://docs.python.org/dev/library/asyncio.htmlから多くの機能を提供します

私は記事を書いて、なぜトルネードを検討したのかを説明しました。トルネード-トルネードの機能についてもっと多くを書いた最高のPython Webフレームワークです。


15

更新:残念ながら、ここでいくつかの回答がGeventを推奨したり言及したりすることに驚いています。これは、この優れたライブラリの人気、パフォーマンス、使いやすさに比例しているとは思えません。)

GeventとTwistedは、相反することが最初は明白に思えるかもしれませんが、相互に排他的ではありません。geventreactorつまり、両方の世界の最良の部分を比較的スムーズに活用できるようにするというプロジェクトがあります。

  • Geventの効率的で安価な(協調的なグリーン)スレッドモデル。並行性に関してはプログラミングがはるかに簡単です。率直に言って、Twisted inlineCallbacksは、多くのコルーチンに関してはパフォーマンスの点で単純に機能していません。使いやすさ/透明性の条件:yieldそしてDeferredsどこでも; 多くの場合、いくつかの抽象化を構築することは困難です。Deferredだけでなく、の両方で恐ろしく役に立たないスタックトレース、さらに@inlineCallbacks
  • Twistedに組み込まれているすべての機能が含まれていIReactorProcess.spawnProcessます。

私は現在、Gevent 1.0rc2とTwisted 12.3をブリッジして使用していgeventreactorます。私は、まだ公開されていない独自の追加および拡張機能を実装しました。geventreactorこれは、うまくいけば、geventreactor元のGitHubリポジトリの一部として公開する予定です:https : //github.com/jyio/geventreactor

私の現在のレイアウトはGeventの素敵なプログラミングモデルでプログラムに私を可能にし、このような非ブロッキングとして活用するものsocketurllib2および他のモジュール。学習曲線や、単純で基本的なことさえツイスト方式で行うことの不便さとは対照的に、私は通常のPythonコードを使用して通常のことを行うことができます。また、通常はTwistedで問題となる、またはスレッドの使用が必要なほとんどのサードパーティライブラリを簡単に使用できます。

また、グリーンレットを使用することで、Deferredsやコールバックの代わりに、厄介でしばしば過度に複雑なコールバックベースのプログラミングを完全に回避することもできます@inlineCallbacks

(この回答は、実際のプロジェクトでTwistedとGeventの両方を使用した個人的な経験に基づいて作成され、Twistedを使用した経験が大幅に増えました(ただし、Twistedのエキスパートであるとは主張していません)。 Twistedの機能をあまり使用する必要がなかったので、Twistedに必要な機能のセットによっては、GeventとTwistedを混合することの(比較的無痛の)余分な複雑さは、問題に値しないかもしれません。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.