Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python套接字:无限循环套接字绑定,侦听是否会导致内存溢出?_Python_Loops - Fatal编程技术网

Python套接字:无限循环套接字绑定,侦听是否会导致内存溢出?

Python套接字:无限循环套接字绑定,侦听是否会导致内存溢出?,python,loops,Python,Loops,以上是我在无限循环中的编码,以保持监听客户端, 等待客户端发送数据并打印。这就是全部。 这种写入方法是否会导致内存溢出?因为不断打开插座,并以无限循环关闭 p/S:我尝试过一次绑定并侦听套接字,只使用.recv循环,但它不起作用。只能接收一次数据。如果“内存溢出”是指“内存泄漏”,那么不,这里没有内存泄漏 每次通过循环时,一旦您重新分配了s和c,您就没有对前面的值的其他引用,因此它们将被垃圾收集。在CPython,这应该马上发生;在其他实现(PyPy、Jython、IronPython)中,这种

以上是我在无限循环中的编码,以保持监听客户端, 等待客户端发送数据并打印。这就是全部。 这种写入方法是否会导致内存溢出?因为不断打开插座,并以无限循环关闭

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

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

每次通过循环时,一旦您重新分配了
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!')