[解決済み] Twistedの何がそんなにクールなのか?[クローズド]
質問
最近、Pythonの ツイスト フレームワークがロックで、他のフレームワークはそれに比べて見劣りするという話を聞くことが多くなっています。
誰かこれに光を当てて、おそらくTwistedと他のネットワーク・プログラミング・フレームワークを比較してもらえませんか。
どのように解決するのですか?
Twistedには、あなたがクールだと感じるかもしれない様々な側面があります。
Twistedはたくさんのプロトコル実装を含んでいます。つまり、リモートシステム(ほとんどの場合、クライアントかサーバーのどちらか)と話すために使えるAPIがあるはずです。 HTTP , FTP , smtp、pop3、imap4 , DNS , IRC、MSN、OSCAR、XMPP/Jabber , テルネット、SSH , SSL NNTP のいずれか、あるいは 本当に のような低レベルのプロトコル構築プロトコルの一つです。 DJB の ネットストリングス , 単純なラインオリエンテッドプロトコル のようなTwistedのカスタムプロトコルの一つもあります。 パースペクティブブローカー (PB) または 非同期メッセージングプロトコル(AMP) .
Twistedのもう一つのクールな点は、これらの低レベルなプロトコル実装の上に、しばしば、より使いやすい抽象化を見つけることができることです。 例えば、HTTPサーバを書くとき、Twisted Webは を提供します。 これは、リクエストがどのように応答されるかを定義するために、PythonオブジェクトからURL階層を構築することを可能にします。
これらのすべては、協調するAPIと結びついています。これは主に、この機能のどれもがネットワーク上のブロッキングによって実装されていないという事実によるもので、そのため スレッドを起動する必要がありません。 . これは、人々がしばしばTwistedの特徴として挙げるスケーラビリティに貢献します(ただし、それは単一のコンピュータのみを含むスケーラビリティであり、アプリケーションがホスト群の全体を使用するように成長するようなスケーラビリティではありません)。なぜならTwistedは単一のスレッドで何千もの接続を扱うことができ、それぞれが単一の接続に対して何千ものスレッドを持つよりもうまくいく傾向があります。
スレッド化を避けることは、テストとデバッグ(そしてそれ故に一般的に信頼性)にも有益です。 典型的なTwistedベースのプログラムでは、プリエンプティブなコンテキストスイッチはありませんので、一般的にロックについて心配する必要はありません。 異なるネットワークイベントの発生順序に依存するレースコンディションは、それらのネットワークイベントをシミュレートすることによって簡単にユニットテストできます(一方、コンテキストスイッチをシミュレートすることは、ほとんどの(どんな?)スレッディングライブラリによって提供される機能ではありません)。
Twistedはまた、本当に、本当に 品質へのこだわり . だから、あなたは 回帰を見つけることはほとんどありません というのは、私たちは、一般的な方法だけでなく、あなたがそれらを使うかもしれないすべての方法をテストしようとするためです。 これは、特に過去3、4年の間にTwistedに追加された(または修正された)すべてのコードに当てはまります。なぜなら、100%のラインカバレッジは、それ以来、最低限のテスト要件となっているからです。
Twistedのもう一つの見落とされがちな強さは、異なるプラットフォームの 風変わりな . 異なるプラットフォームには文書化されていないソケットエラーがたくさんあり、それらを扱うことはおろか、それらが存在することさえ学ぶのは本当に難しいことです。 Twistedはこれらのエラーを徐々にカバーするようになり、現時点ではかなり良くなっています。 若いプロジェクトにはこの経験がないので、おそらくあなたがリリースしたプロジェクトのユーザーにしか起こらないような、不明瞭な失敗モードを見逃してしまうのです。
とはいえ、私がTwistedについて最もクールだと思うのは、それがかなり退屈なライブラリであり、多くの本当に退屈な問題を無視して、ただ面白くて楽しいことに集中させてくれることです :)
関連
-
[解決済み] UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Python setup.py develop vs install
-
[解決済み] getattr()とは何ですか、どのように使うのですか?
-
[解決済み】メソッドの型ヒントは、どのようにエンクロージャクラスの型を使用するのですか?
-
[解決済み】Pythonで直接実行可能なクロスプラットフォームGUIアプリを作成する
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] if 節の終了方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Pythonです。未束縛のメソッドを束縛する?
-
[解決済み] Djangoで2つの日付の間を選択する
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] virtualenvsはどこに作成するのですか?
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する