如果我需要关闭客户端套接字句柄( conn ),比如"conn.close()“,我就不需要了?
如果我运行多线程来处理客户端套接字fd ( conn )。服务器运行时间过长会不会造成内存泄漏?
如果客户端没有调用conn.close(),服务器会不会关闭客户端套接字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"发布于 2016-07-15 10:31:07
根据document,close在套接字被垃圾回收时被调用。因此,如果您没有关闭它,无论出于什么原因,您的程序可能是正常的。假设你的套接字对象得到了GCed。
但是,作为标准实践,当您的代码使用完套接字时,您必须关闭套接字或释放任何资源。
有关在Python中管理套接字对象的信息,请查看How to use socket in Python as a context manager?
发布于 2016-07-15 13:04:59
找出答案的一种方法是测试并查看!下面是我在Mac (OS X 10.11.5)上运行的一个小Python脚本。如果我取消注释holdSockets.append()行,此脚本在创建253个套接字后会出错("socket.error: Too open open files")。但是,如果我将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" % counthttps://stackoverflow.com/questions/38386870
复制相似问题