我有以下程序来打开大量的套接字,并保持打开状态以对我们的一台服务器进行压力测试。这有几个问题。我认为它可能比递归调用高效得多,而且它仍然以串行方式而不是并行方式打开套接字。我意识到有一些像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)
你可以尝试使用Twisted。它大大简化了Python上的网络。他们的网站有some tutorials让你开始。在
但是,您可以很容易地看到使用Python来完成这个任务。一个更快的破解方法是只打开1500个nc实例:
好吧,它已经是多进程了—在调用open_socket之前先睡一觉,然后从shell运行500个进程:
你并没有真正连接到某个东西-似乎你在设置服务器套接字?如果你需要连接到某个东西,你应该用并行性(多线程,或者像上面所示的那样运行许多进程,或者使用异步连接)来测试它。This应该有兴趣阅读:
我很困惑为什么要用递归而不是简单的循环。我的猜测是,使用一个简单的循环,您将一次又一次地重写变量sockname,这样Python的垃圾回收实际上会在创建下一个套接字之后关闭上一个套接字。解决方案是将它们全部存储在一个列表中,以防止Python对它们进行垃圾收集:
还要注意,在代码中,对sockname的第一个赋值是完全冗余的,因为它被第二个赋值覆盖。在
相关问题 更多 >
编程相关推荐