0

Python で HTTP サーバー ベースのゲームを開発しています。依存関係をできるだけ少なくする計画なので、スタンドアロンの Web サーバー (Apache、Lighttpd、nginx など) をインストールせずに動作するようにしたかったのです。問題は、それが機能しないことです。

次のバージョンを試しました。

  • BaseHTTPServer.HTTPServer (+SocketServer.ThreadingMixIn)
  • wsgiref.simple_server
  • twisted.web.server

高負荷 ( siege -b -c 100 -t 30s) の下に置くと、いずれかで部分的に失敗しました。

[error] socket: read error Connection reset by peer sock.c:460: Connection reset by peer

また

[error] socket: -1313092800 address is unavailable.: Cannot assign requested address

部分的に私が意味するのは、一部のリクエストは処理され、一部は処理されなかったということです。

一方、Lighttpd + Flask (つまり WSGI) または Lighttpd + PHP (コントロール ケースとして) を試してみたところ、まったく問題なく動作しました。可用性 100%、同時実行性 100%。

後者の動作バージョンのため、問題は、同じマシン上でsiege実行siegeされているサーバー、またはマシン自体 (ちなみに Ubuntu 12.04) ではないと思います。

注: すべてのケースで、単純な「hello world」サーバーをテストして、バグの可能性を最小限に抑えました。

だから私の2つの質問:

  1. Python ウェブサーバーが不安定なのはなぜですか? (解決策ではなく、正確には原因は何ですか?)
  2. スタンドアロン Web サーバー + Python を使用することが唯一の/最良の解決策 (Python に固執する場合) ですか、それとも何か不足していますか?
4

1 に答える 1

2

だから私の 2 つの質問: なぜ Python ウェブサーバーは不安定なのですか? (解決策ではなく、正確には原因は何ですか?)

ここでの問題は、不安定という言葉です。サーバー プロセスの実装制限に達しています。これは、必ずしも不安定であることを意味するわけではありません。車を限界まで追い込むようなものです。速度を上げられなくなったとき、車は不安定だと思いますか?

これは、「適切な仕事に適したツールを見つける」という典型的な問題です。1 つはアプリケーション サーバーで、もう 1 つは大量の要求を処理し、接続プールを処理することです。後者は、並行性とルーティングを処理するために構築された nginx、lighttpd、apache、uwsgi などの (Web) サーバーによって処理されるタスクです。

詳細には、試したサーバーは、最大量のリクエストを処理するように構築されています。その制限に達すると、接続がドロップされます。後で接続をキューに入れるようには構築されていません。

試したことがない場合は、Tornadoもご覧ください。ゲーム サーバーに適しています。

スタンドアロン Web サーバー + Python を使用することが唯一の/最良の解決策 (Python に固執する場合) ですか、それとも何か不足していますか?

はい。これは、Python だけでなく、最適なソリューションです。よくあるデザインパターンです。Ruby、PHP、Java でも同じアプローチが見られます。最も一般的なタスクは、アプリケーション サーバーのクラスター全体に負荷を分散することです。

一般的な環境は次のとおりです。

USER -> BALANCER (nginx,apache,ecc) -> APPSERVER (uwsgi, twisted, gunicorn, ..) -> WSGI Application
于 2013-10-08T10:43:33.047 に答える