2016-07-15 22 views
0

"conn.close()"のようなクライアントソケットハンドル(conn)を閉じる必要がある場合はありませんか?TCPソケットサーバのクライアント接続fdがメモリリークの原因になりますか?

私はクライアントソケットfd(conn)をハンドリングするためにマルチスレッドを実行します。サーバーが長時間実行されるとメモリリークが発生しますか?

クライアントがconn.connect()を呼び出さない場合、サーバーはクライアントソケットfdを閉じませんか?続き

は私のTCPソケットサーバコードです:

# coding: utf-8 

import socket 
import os, os.path 
import time 

sockfile = "./communicate.sock" 

if os.path.exists(sockfile): 
    os.remove(sockfile) 

print "Opening socket..." 

server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
server.bind(sockfile) 
server.listen(5) 

print "Listening..." 
while True: 
    conn, addr = server.accept() 
    print 'accepted connection' 
    while True: 
    data = conn.recv(1024) 

    if not data: 
     break 
    else: 
     print "-" * 20 
     print data 
     print "DONE" == data 
     if "DONE" == data: 
      # If I need to invoke conn.close() here? 
      break 
print "-" * 20 
print "Shutting down..." 

server.close() 
os.remove(sockfile) 
print "Done" 

答えて

2

documentによると、ソケットがガベージコレクトされたときに、closeが呼び出されます。あなたが何らかの理由でそれを閉じなければ、プログラムはおそらく大丈夫でしょう。あなたのソケットオブジェクトがGCedになることが条件です。

しかし、標準的な習慣として、あなたのコードが完了したら、ソケットを閉じるか、リソースを解放する必要があります。 Pythonでのソケットオブジェクトを管理するための

、見つけるための1つの方法は、それをテストして見ることです How to use socket in Python as a context manager?

+0

私の言語がPythonでない場合は、C++などのGCがないためです。 cliendソケットfdを閉じる必要がありますか? – scott1028

1

をチェックしてください!ここに私のMac(OS X 10.11.5)で走った小さなPythonスクリプトがあります。 holdSockets.append()行のコメントを外すと、このスクリプトは253個のソケットを作成した後にエラーを出します(「socket.error:開いているファイルが多すぎます」)。しかし、holdSockets.append()行をコメントアウトしたままにしておくと、ソケットがガベージコレクトされるので、スクリプトはエラーなく無期限に実行されます。

#!/bin/python 

import socket 
import time 

count = 0 

holdSockets = [] 

while True: 
    count += 1 
    nextSock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
    #holdSockets.append(nextSock) 
    time.sleep(0.1) 
    print "Created %i sockets" % count 
+0

ありがとう! gcをテストすることは良い考えです。 – scott1028

関連する問題