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

问题描述 投票:0回答:4

我有以下程序来打开大量套接字,并保持它们打开以对我们的一台服务器进行压力测试。这有几个问题。我认为它可能比递归调用更有效,而且它实际上仍然以串行方式而不是并行方式打开套接字。我意识到像 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)
python sockets
4个回答
4
投票

我很困惑为什么你会使用递归而不是简单的循环。我的猜测是,通过一个简单的循环,您将一次又一次地覆盖变量 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 的第一个分配是完全多余的,因为它被第二个分配覆盖。


2
投票

您可以尝试使用 Twisted 来实现此目的。它极大地简化了 Python 上的网络连接。他们的网站有一些教程可以帮助您入门。

但是,您很容易发现使用 Python 来完成此任务有点大材小用。更快的破解选项是仅打开 1500 个 nc 实例:

for i in {3000..4500};
do
    nc -l -p $i &
done

0
投票

它已经是多进程了 - 在调用 open_socket 之前先休眠,然后从 shell 运行其中的 500 个:

for i in `seq 500`; do ./yourprogram & done

您实际上并没有连接到某些东西 - 似乎您正在设置服务器套接字?如果您需要连接到某些东西,您当然应该使用并行性(多线程,或运行多个进程,如上所示或使用异步连接)来测试它。 应该有兴趣阅读:


0
投票

大家好,任何人都可以解决我的问题。目前我面临着这样的情况,我正在创建多个套接字对象,但之后它被覆盖,然后我将所有套接字存储在一个列表中,但每当我尝试连接时,它仅连接一个端口而不是连接所有端口。提供一些建议,如果可能的话,您可以一次发送多个套接字连接的示例代码。谢谢你。

© www.soinside.com 2019 - 2024. All rights reserved.