Python: лучший способ открыть множество сокетов - PullRequest
1 голос
/ 10 июля 2009

У меня есть следующая программа, чтобы открыть множество сокетов и держать их открытыми для стресс-тестирования одного из наших серверов. Есть несколько проблем с этим. Я думаю, что это может быть намного эффективнее, чем рекурсивный вызов, и он все еще открывает сокеты последовательным способом, а не параллельным способом. Я понимаю, что есть такие инструменты, как 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 ]

4 голосов
/ 10 июля 2009

Я был озадачен, почему вы бы использовали рекурсию вместо простого цикла. Я предполагаю, что с помощью простого цикла вы бы перезаписывали переменную 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 голосов
/ 10 июля 2009

Вы можете попробовать использовать Twisted для этого. Это значительно упрощает работу в сети на Python. На их сайте есть несколько учебников , с которых можно начать.

Тем не менее, вы можете легко увидеть использование Python для этой задачи. Более быстрый вариант взлома - открыть 1500 экземпляров nc:

for i in {3000..4500};
do
    nc -l -p $i &
done
0 голосов
/ 10 июля 2009

Ну, это уже мультипроцесс - засыпайте перед вызовом open_socket и запускайте, скажем, 500 из них из оболочки:

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

Хотя вы на самом деле не подключаетесь к чему-то - кажется, вы настраиваете серверные сокеты? Если вам нужно подключиться к чему-либо, вам следует протестировать его с параллелизмом (с несколькими потоками, или запустить много процессов, как показано выше, или использовать асинхронное подключение). Это должно быть интересно читать:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...