2011-02-10 5 views
0

私はWindows上でApache/Mod_WSGIの下でDjangoサーバーを実行しています。私のユーザー要求の処理の一環として、ネットワークI/Oを必要とする多くのことを行います。 Django ORM(別のマシンのデータベースサーバー)を使ってクエリを実行します。また、非Django ODBCクエリを作成し、ネットワーク共有上のファイルとディレクトリを読み込み、他のWebサイトをスクラップします。Django内のブロックネットワーク呼び出しはすべてのスレッドをブロックしますか?

私のネットワークI/Oの少なくとも一部がブロックされていることは間違いありません(ODBCクエリとWebスクラップングを心に留めておくこと)。 Windows上のApacheには、マルチプロセスモデルではなく、スレッド処理モデルしかありません。

私の最初の質問は次のとおりです。要求に応答しているときにネットワーク接続をブロックすると、Apacheサーバー内のすべてのスレッド、または要求に応答しているスレッドだけがブロックされますか?

私の2番目の質問は、これらの4種類のネットワークコール(Django ORM、ODBC、ネットワーク共有、HTTP)がノンブロッキングであることが知られていますか?

答えて

2

単純な答えはいいえ、他のリクエストスレッドをブロックすべきではありません。これは、呼び出しをブロックすることでPython GILをリリースするC言語のコードに依存しています。システムネットワークとファイルシステム関数を扱うすべてのPythonコードラッパーはこれを正しく行います。また、必要に応じてGILをリリースすることを知っているので、メインストリームのデータベースアダプタでも問題ありません。ブロッキングの問題は、通常、ネイティブに書かれた第三者のC拡張モジュールが出てきます。ここでは、人々はそれほどよく分かっていませんが、最近はまれです。

関連する問題