2012-04-09 13 views
2

私はxmpppyを使用しています。私はxmpp接続の50以上のスレッドを作成します。後でエラーが発生します:xmpppy。選択肢の範囲外のファイル記述子

File "transports.py", line 199, in pending_data return select.select([self._sock],[],[],timeout)[0] ValueError: filedescriptor out of range in select()

なぜそれが起こりますか?

P.S.私の言い訳には申し訳ありません。

+0

これは、ファイル記述子が不足していることを示していることがあります。ファイル/接続を適切に閉じていないと、マルチスレッド環境で非常に簡単に発生する可能性があります。 Linuxでは '/ proc//fd /'を見ることで、あなたのアプリケーションの(開いている)ファイルのリストを見ることができます。ここで 'はあなたのプログラムのプロセスIDです。これが大きい(1024に近づいている)場合は、(a)コードに問題があるか、(b)プログラムのオープンファイル制限を大きくする必要があります。 – larsks

答えて

3

xmpppyは、オープンコールを監視するためにselect()システムコールを使用します。残念なことに、select()は非常に扱いにくい制限があります。ほとんどのシステムでは、ファイル記述子の番号で接続を監視できるのは1024個までの一定の制限までしか監視できません。

これは、ファイルと接続をさらに開くと、限界に達する。

解決策は、poll()またはepollやkqueueのような、より現代的な(ただしOS固有の)APIを使用することです。これらはすべてPythonの'select' moduleでアクセスできます。