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

时间:2009-07-09 21:02:03

标签: python sockets

我有以下程序打开很多套接字,并将它们打开以对我们的服务器进行压力测试。这有几个问题。我认为它可能比递归调用更有效,并且它仍然以串行方式而不是并行方式打开套接字。我意识到有像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)

3 个答案:

答案 0 :(得分: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的第一个赋值是完全冗余的,因为它被第二个赋值覆盖。

答案 1 :(得分:2)

您可以尝试使用Twisted。它极大地简化了Python上的网络。他们的网站some tutorials让您入门。

但是,你可以很容易地看到Python使用这个任务的过度杀伤力。更快的选择是打开1500个nc实例:

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

答案 2 :(得分:0)

好吧,它已经是多进程 - 在调用open_socket之前暂停一下,然后从shell中运行500个:

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

你实际上并不是真正的连接 - 似乎你正在设置服务器套接字?如果你需要连接到某些东西你应该用并行性测试它(多个线程,或运行如上所示的许多进程或使用asyncronous connect)。应该感兴趣This