Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:打开大量套接字的更好方法_Python_Sockets - Fatal编程技术网

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

Python:打开大量套接字的更好方法,python,sockets,Python,Sockets,我有下面的程序来打开很多套接字,并保持它们打开以对我们的一台服务器进行压力测试。这有几个问题。我认为它可能比递归调用更有效,而且它仍然以串行方式而不是并行方式打开套接字。我意识到有像ab这样的工具可以模拟我正在尝试做的事情,但我希望增加我的python知识。这是我应该重写为多线程或多进程的东西吗 > #!/usr/bin/env python > > import socket, time, sys > sys.setrecursionlimit(2000) >

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

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

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

不过,您并不是一个真正连接到某个东西的用户—似乎您正在设置服务器套接字?如果您需要连接到某个对象,您肯定应该使用并行性(多线程,或者运行许多进程,如上图所示,或者使用异步连接)对其进行测试。应该有兴趣阅读:

这已经是多进程了-在调用open_socket之前先进行睡眠,然后从一个shell运行500个:

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

不过,您并不是一个真正连接到某个东西的用户—似乎您正在设置服务器套接字?如果您需要连接到某个对象,您肯定应该使用并行性(多线程,或者运行许多进程,如上图所示,或者使用异步连接)对其进行测试。应该有兴趣阅读:

您可以为此尝试使用Twisted。它大大简化了Python上的网络。他们的网站必须让你开始

然而,您可以很容易地看到,对于这项任务,使用Python是一种过分的做法。黑客攻击的一个更快的选择是只打开1500个nc实例:

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

您可以尝试使用Twisted进行此操作。它大大简化了Python上的网络。他们的网站必须让你开始

然而,您可以很容易地看到,对于这项任务,使用Python是一种过分的做法。黑客攻击的一个更快的选择是只打开1500个nc实例:

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

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

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

只是侦听而没有接受?我不知道是否需要接受()。如果我没有添加conn,addr=sockname.accept(),我会在netstat输出中得到FIN_WAIT消息吗?只是侦听而没有接受?我不确定我需要接受()。如果我没有添加conn,addr=sockname.accept(),我会在netstat输出中得到FIN_WAIT消息吗?我想知道如何在python中实现这一点,但这是一个优雅的解决方案,如果我有代表,我会投票支持它。谢谢。我想知道如何在python中实现这一点,但这是一个优雅的解决方案,如果我有代表的话,我会投赞成票。谢谢。这是一篇有趣的文章。谢谢我不认为我会使用asyncore解决这个问题,但我认为它为我解决了另一个问题。至于上面的代码片段,我最初有相同的逻辑,接受创建套接字并在递归函数中运行socket.connect()。我只是很不擅长发布问题,所以我遗漏了一些信息,并发布了部分错误代码。虽然sockname的第一个赋值实际上是生成枚举句柄来连接,但这是一个有趣的阅读。谢谢我不认为我会使用asyncore解决这个问题,但我认为它为我解决了另一个问题。至于上面的代码片段,我最初有相同的逻辑,接受创建套接字并在递归函数中运行socket.connect()。我只是很不擅长发布问题,所以我遗漏了一些信息,并发布了部分错误代码。虽然对sockname的第一个赋值实际上是生成枚举句柄以进行连接。