TCP Socket Server客户端连接fd是否会导致内存泄漏?

时间:2016-07-15 02:13:19

标签: python sockets tcp serversocket

如果我需要关闭客户端套接字句柄(conn),例如" conn.close()" ?

如果我运行多线程来处理客户端套接字fd(conn)。如果服务器运行时间太长,是否会导致内存泄漏?

如果客户端没有调用conn.close(),服务器是否会关闭客户端套接字fd?

以下是我的tcp-socket服务器代码:

# 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 个答案:

答案 0 :(得分:2)

根据document,当套接字被垃圾收集时调用close。因此,如果你因为某种原因没有关闭它,你的程序可能会没问题。如果你的套接字对象确实得到GCed。

但是,作为标准做法,您必须在代码完成后关闭套接字或释放任何资源。

要在Python中管理套接字对象,请查看 How to use socket in Python as a context manager?

答案 1 :(得分:1)

找到答案的一种方法是测试并看到!这是我在Mac上运行的一个小Python脚本(OS X 10.11.5)。如果我取消注释holdSockets.append()行,则在创建253个套接字后,此脚本会出错(" socket.error:打开文件太多")。但是,如果我将holdSockets.append()行注释掉,以便可以对套接字进行垃圾回收,则脚本将无限期地运行而不会出现任何错误。

firstSubViewModel
相关问题