2009-03-11 15 views
9

私は最近、ソケットサーバーを実装するために使用できるいくつかの戦略をリストしたthis documentを読んでいました。つまり、彼らは以下のとおりです。Pythonでソケットベースのサーバーを作成することをお勧めしますか?

  1. は、各スレッドで多くのクライアントにサービスを提供し、各スレッドで多くのクライアントにサービスを提供し、ノンブロッキングI/Oと準備変更通知を使用するノンブロッキングI/Oとレベルトリガの準備通知​​
  2. を使用します
  3. カーネル
にサーバーコードをビルドし、各サーバのスレッドで多くのクライアントにサービスを提供し、非同期を使用するI/O
  • 各サーバのスレッドで一つのクライアントにサービスを提供し、
  • I/Oをブロック使用

    CPythonので使用するヒントをにしていただき、ありがとうと思います。ここにはいくつかの点や悪い点があります。私は主に高い並行性の下でパフォーマンスに関心があり、現在の実装の数が遅すぎます。

    私は簡単なものから始めることができますが、「5」が出ています。カーネルに何かをハッキングするつもりはないからです。

    "4" GILのために外出する必要があるようにも見えます。もちろん、スレッドの代わりにマルチプロセッシングを使うこともできます。 IOのブロックには、理解しやすいという利点もあります。

    「1」の伝統的な選択または自明マルチプロセッシングと組み合わせることができるの世論調査です:

    そして、ここに私の知識が少し衰退します。

    「2」の準備変更通知、新しいファイルディスクリプタによって使用され、kqueueのある

    「3」私はPythonのラッパーを持っている。このため、カーネルの実装があることを確認していません。

    だから、PythonにはTwistedのような素晴らしいツールのバッグがあります。私はTwistedをベンチマークしていますが、マルチプロセッサマシンでは遅すぎると感じましたが、それらはもっと良いアプローチです。多分ロードバランサで4つのねじれがあるかもしれませんが、わかりません。アドバイスをいただければ幸いです。マルチプロセッサ(マルチコア)マシンとして

  • 答えて

    7

    asyncoreは、基本的には「1」です。内部ではselectを使用しており、すべての要求を処理するスレッドが1つだけです。ドキュメントによると、pollも使用できます。 (編集:ツイストリファレンスを削除、私はそれがasyncoreを使用すると思ったが、私は間違っていた)。

    「2」はpython-epollで実装されている可能性があります(これは以前は見たことがありません)。 編集:(コメントから)Python 2で。6 select moduleにepoll、kqueue、kevent build-in(サポートされているプラ​​ットフォーム)があります。したがって、エッジトリガーサービスを行うために外部ライブラリは必要ありません。

    スレッドがIO操作(実際にはほとんどの場合)を実際に実行しているか待機しているときにGILが削除されるため、「4」を除外しないでください。もちろん、接続数が膨大な場合は意味がありません。あなたが処理することがたくさんある場合は、これらのスキームではPythonが意味をなさないかもしれません。

    柔軟性については、Twistedをご覧ください。

    実際には、問題は、要求に対して処理する処理の量によって決まります。処理量が多く、マルチコア並列処理を利用する必要がある場合は、おそらく複数のプロセスが必要になります。一方、たくさんの接続を聞くだけで、selectまたはepollを行う必要がある場合は、スレッドの数が少なくても動作するはずです。

    +0

    と言っています。epollは2.6以降ではstdlib、2.5ではeasy_installableと考えています。パッケージはselect-somethingと呼ばれます。曖昧さを残して申し訳ありません。 –

    +0

    Twistedはepollを使うこともできます。実際、Twistedは、サポートされているすべてのイベント通知APIを、それが提供する統一されたAPIに変えます。したがって、プラットフォームが実行できるベストがselectである場合、アプリはselectを使用します。 epollがある場合、あなたのアプリはepollを使用します。すべてあなたに透過的に。 –

    +0

    「asyncore」と書かれています – new123456

    1

    http://docs.python.org/library/socketserver.html#asynchronous-mixins

    GILのためにCPythonを使用するには、コアごとに少なくとも1つのプロセスが必要です。あなたはCPythonが必要だと言うので、それをForkingMixInでベンチマークしようとするかもしれません。 Linux 2.6ではいくつか興味深い結果が得られるかもしれません。

    その他の方法はStackless Pythonです。それはhow EVE solved itです。しかし、私はそれが常に可能ではないことを理解しています。

    +0

    おかげで、しかし、あなたはそれらのものをベンチマークがありますか?彼らは遅いです。私がする必要がなければ、私は車輪を発明しないだろう。 –

    +0

    +1 stackless/EVEですが、私はCPython –

    1

    私はダグラスの答えを好きですが、さておき...

    としてあなたが達成を支援するワーカースレッド/ processesのプールにselectと、デリゲートを使用しての準備の通知をリッスンする集中型のディスパッチスレッド/プロセスを使用することができますあなたの並列性の目標。

    しかしダグラスが言及しているように、GILは(Python-APIのようなことは起こっていないので)最も長いI/O操作中に保持されることはないため、応答待ち時間の場合は、 CPython APIへのコードの重要な部分。

    2

    リンクを追加することはできますか?

    cogenは、Python 2.5の拡張ジェネレータを使用したネットワーク指向のコルーチンベースのプログラミングのためのクロスプラットフォームライブラリです。コーゲンプロジェクトのメインページには、同様の目的を持ったいくつかのプロジェクトへのリンクがあります。

    3

    「フォーク」はどうですか? (私はそれがForkingMixInのものと仮定している)リクエストが "共有されていない"(DBまたはファイルシステム以外の)アーキテクチャで処理される場合、fork()はほとんどの* nixesでかなり早く開始し、すべてのばかげたバグと糸通しの合併症について。

    スレッドは、非常に重いプロセスのIMHOによって強制される設計上の問題です。とにかくインタプリタを実行している場合は、特にコピーオンライト属性を持つページテーブルを複製することはわずかな費用のようです。

    私はより具体的にすることはできませんが、(私は仕事でのJavaの塊の上に奴隷ないよと)私はPerlの-移行ツーRubyのプログラマのよりごめんなさい


    更新私は最終的に私の "余暇"でスレッド対フォークのいくつかのタイミングを行いました。それをチェックアウト:

    拡張

    http://roboprogs.com/devel/2009.04.html

    http://roboprogs.com/devel/2009.12.html

    +0

    さらに、子プロセスを開始する前に使用することがわかっている他のモジュールのコードを引き出すことができます。これにより、トークン化(JIT-ed、何でも)が繰り返されるのを防ぐことができます。第2に、親のデータを小さく保ち、スーパーガベージコレクタとして「exit」を使用します。 – Roboprog

    3

    一つsollutionはgeventです。 Geventは、グリーンレットによって実装された軽量協調作業切り替えによるlibeventベースのイベントポーリングを行います。

    優秀で直接的なIOプログラミングのモデルを使って、イベントシステムのすべてのパフォーマンスとスケーラビリティを得ることができます。

    (私は古い質問を本当にするために答える程度SO大会が何であるかを知っているが、私はまだ私の2セントを追加したいことを決めていない)

    関連する問題