Подключайтесь и обрабатывайте несколько сырых сокетов одновременно в Python 2.x

Я новичок в Python, и пытаюсь изучить его "на работе". И я обязан это сделать.

Я обязан общаться с 3 серверами с необработанным сокетом. Я могу легко сделать это последовательно. Но мне было интересно, есть ли способ, которым я могу общаться с этими 3 серверами одновременно? Все 3 сервера имеют разные IP-адреса.

В основном попробуйте сделать следующее, но в 1 шаг:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST1, PORT1))
s.connect((HOST2, PORT1))
s.connect((HOST3, PORT1))

что тоже нужно позже s.sendall() & s.recv() быть распараллеленным.

4 ответа

Решение

Этот ответ с использованием потоков действительно сработал для меня.

Если у вас есть только один поток прослушивания, вы можете использовать команду select для ожидания нескольких сокетов и проснуться, когда любой из них вернет данные:

https://docs.python.org/2/library/select.html

Трудно прописать множество знаний, не зная дополнительной информации о протоколе вашего сервера, о том, что вы слушаете и что вы собираетесь с ним делать, и т. Д., Но я могу представить, если не будет никакой дополнительной информации, сценарий, в котором связь обрабатывается мультипроцессором. Пул (3), где каждый член пула сопоставляется с IP-адресом, и где все три отправляют данные в один и тот же мультипроцессинг.Queue (), который оценивается потоком цикла.

Какие-нибудь дополнительные детали?

Желаем удачи на работе!

Взгляните на модуль asyncio.

Он требует Python 3, но позволяет писать однопоточные приложения с несколькими контекстами выполнения - разновидность совместной многопоточности, где контекст переключается только тогда, когда пользователь говорит об этом. Вы действительно получаете лучшее из потока и параллелизма на основе событий.

Другие вопросы по тегам