Python套接字:无限循环套接字绑定,侦听是否会导致内存溢出?
以上是我在无限循环中的编码,以保持监听客户端, 等待客户端发送数据并打印。这就是全部。 这种写入方法是否会导致内存溢出?因为不断打开插座,并以无限循环关闭 p/S:我尝试过一次绑定并侦听套接字,只使用.recv循环,但它不起作用。只能接收一次数据。如果“内存溢出”是指“内存泄漏”,那么不,这里没有内存泄漏 每次通过循环时,一旦您重新分配了Python套接字:无限循环套接字绑定,侦听是否会导致内存溢出?,python,loops,Python,Loops,以上是我在无限循环中的编码,以保持监听客户端, 等待客户端发送数据并打印。这就是全部。 这种写入方法是否会导致内存溢出?因为不断打开插座,并以无限循环关闭 p/S:我尝试过一次绑定并侦听套接字,只使用.recv循环,但它不起作用。只能接收一次数据。如果“内存溢出”是指“内存泄漏”,那么不,这里没有内存泄漏 每次通过循环时,一旦您重新分配了s和c,您就没有对前面的值的其他引用,因此它们将被垃圾收集。在CPython,这应该马上发生;在其他实现(PyPy、Jython、IronPython)中,这种
s
和c
,您就没有对前面的值的其他引用,因此它们将被垃圾收集。在CPython,这应该马上发生;在其他实现(PyPy、Jython、IronPython)中,这种情况会发生在一些不可预测的时刻
但是,文件句柄可能存在问题。“某些不可预测的点”是由您清理内存的需要驱动的。如果您有其他资源需要比内存更积极地清理,那么您不能依赖GC来为您清理。套接字(文件句柄)正是这样一种资源。您不希望有25000个未使用的插槽,GC没有触及这些插槽,因为它们只使用了500KB的内存
每次通过循环都显式调用c.close()
;您应该对s
执行相同的操作。或者,最好将与:
块一起使用
尽管如此,这是一个非常奇怪的设计;仅仅因为它不泄漏内存并不意味着你真的想这么做。你希望
indexer
如何在那里被提升?不,这段代码工作正常,我只是担心内存溢出问题,导致keep bind和监听套接字。你为什么在收到数据后关闭连接?如果您希望多个客户端连接,则应该生成一个新进程来处理每个连接(接受/分叉)模型,或者应该使用选择()
或轮询()
循环在单个进程中多路传输i/o。这些都是基本的设计,网上有很多很好的例子。简单地说:在更高的层次上,你实际上想做什么?
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!')