Pythonでtcpサーバーを書いています。OS - ubuntu 12.04 サーバーはマルチプロセスです。メインプロセスは接続を受け入れています。受け入れられたソケットが削減され、ワーカーに送信されました:
<main process>
h = reduce_handle(conn.fileno())
self.queue.put(h)
ワーカーは、この接続用に分離されたスレッドを作成します。
<worker process>
t = threading.Thread(target=sock_thread, args=(h, DBSession, Protocol))
t.start()
削減されたソケットが回復され、分離されたスレッドで機能します。
<Connection Thread>
fd=rebuild_handle(h)
sock = socket.fromfd(fd,socket.AF_INET,socket.SOCK_STREAM)
<data transmition>
sock.close()
すべて正常に動作します。今日、私は例外を持っています:
error: [Errno 24] Too many open files
サーバーを再起動するとこの問題は解決しましたが、閉じられていないファイルの数が増えました。コマンドラインで監視します:
lsof | grep python | wc -l
何が問題ですか?スレッドで各ソケットを閉じます。すべてのスレッドは正常に機能し、終了します。ソケットを閉じる前に sock.shutdown(socket.SHUT_RDWR) を実行すると、例外が発生します: 不正なファイル記述子です。ソケットに関連付けられたファイルを閉じる方法はありますか?
ありがとう。