Python Socket:无限循环套接字绑定,监听会导致内存泛滥吗?

时间:2013-01-14 22:00:46

标签: python loops

import socket
import sys
import binascii
import datetime
import time

try:
    port = 2122
    host = ''

except IndexError:
    print ("Error: ")
    print ("Be sure to specify username, password, port, database name and table name.\n")
    print ("Syntax: ./script.py username password port db_name table_name.")
    print ("Example: ./script.py hank mypass 8762 testdb test_table")
    print ("\nExit...")
    sys.exit(1)

while 1:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((host, port))
    s.listen(5)
    c, addr = s.accept()
    print ('Connected by', addr)
    data = c.recv(1042)
    s=binascii.hexlify(data)
    print(s)
    data = None
    c.close() 
    time.sleep(1)   
print('Exited!')

以上是我在无限循环中的编码,以保持倾听客户端, 等待客户端发送数据并打印出来。就这样。 这种写法会不会引起内存泛滥?因为保持打开套接字并用无限循环关闭!。

P / S:我试过绑定并监听套接字,只用.recv循环,但它不起作用。只能接收一次数据。

1 个答案:

答案 0 :(得分:1)

如果“内存溢出”是指“内存泄漏”,那么不,这里没有内存泄漏。

每次循环时,一旦重新分配sc,就没有其他对先前值的引用,因此它们将被垃圾回收。在CPython中,这应该立即发生;在其他实现中(PyPy,Jython,IronPython),它将在某个不可预测的点发生。

但是,您可能会遇到文件句柄问题。那个“一些不可预知的点”是由你需要清理内存所驱动的。如果您有其他资源需要比内存更积极地清理,您不能依赖GC来为您完成。而套接字(文件句柄)就是这样一种资源。您不希望在未使用的地方放置25000个插槽,因为它们仅使用500KB内存,因此GC未触及。

每次循环都显式调用c.close();你应该为s做同样的事情。或者,更好的是,使用with:块。

所有这一切,这是一个非常奇怪的设计;只是因为它没有泄漏记忆并不意味着它是你真正想做的事情。