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

2024-04-25 11:37:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 工具程序abtimeport状态sys方式
3条回答

你可以尝试使用Twisted。它大大简化了Python上的网络。他们的网站有some tutorials让你开始。在

但是,您可以很容易地看到使用Python来完成这个任务。一个更快的破解方法是只打开1500个nc实例:

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

好吧,它已经是多进程了—在调用open_socket之前先睡一觉,然后从shell运行500个进程:

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

你并没有真正连接到某个东西-似乎你在设置服务器套接字?如果你需要连接到某个东西,你应该用并行性(多线程,或者像上面所示的那样运行许多进程,或者使用异步连接)来测试它。This应该有兴趣阅读:

我很困惑为什么要用递归而不是简单的循环。我的猜测是,使用一个简单的循环,您将一次又一次地重写变量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的第一个赋值是完全冗余的,因为它被第二个赋值覆盖。在

相关问题 更多 >

    热门问题