3
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循环,但它不起作用。只能接收一次数据。

4

1 回答 1

1

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

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

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

c.close()您每次都通过循环显式调用;你应该对s. 或者,更好的是,使用with:块。

话虽如此,这是一个非常奇怪的设计;仅仅因为它不泄漏内存并不意味着它是你真正想要做的事情。

于 2013-01-14T22:39:10.443 回答