Skip to main content
 首页 » 编程设计

Python:打开大量套接字的更好方法

2025年05月04日21Leo_wl

我有以下程序可以打开很多套接字,并保持打开状态以对我们的一台服务器进行压力测试。这有几个问题。我认为它可能比递归调用更有效,而且它实际上仍然以串行方式而不是并行方式打开套接字。我意识到有像 ab 这样的工具可以模拟我正在尝试做的事情,但我希望增加我的 python 知识。这是我应该重写为多线程还是多进程的东西吗?

> #!/usr/bin/env python 
>  
> import socket, time, sys 
> sys.setrecursionlimit(2000) 
>  
> def open_socket(counter):    
>   sockname = "s" + str(counter)    
>   port = counter + 3000    
>   sockname = socket.socket()   
>   sockname.bind(('localhost', port))   
>   sockname.listen(1)    
>   if counter == 2: 
>     time.sleep(20)    
>   elif counter > 2: 
>     counter = counter -1 
>     open_socket(counter) 
>  
> open_socket(1500) 

请您参考如下方法:

我很困惑为什么你会使用递归而不是简单的循环。我的猜测是,通过一个简单的循环,您会一次又一次地覆盖变量 sockname,这样 Python 的垃圾收集实际上会在您创建下一个套接字后关闭前一个套接字。解决方案是将它们全部存储在一个列表中,以防止 Python 对它们进行垃圾收集:

def open_socket(counter): 
  sockets = [] 
  for i in range(counter): 
     s = socket.socket() 
     s.bind(('localhost', i+3000)) 
     s.listen(1) 
     sockets.append(s) 
  time.sleep(20) 

另请注意,在您的代码中,对 sockname 的第一个赋值是完全多余的,因为它已被第二个赋值覆盖。