Python Блокировка всех экземпляров на одном вводе Программирование сокетов

Я новичок в Python, вот проблема, с которой я столкнулся. Я пытаюсь реализовать p2p DHT.

Ну сценарий такой:

Есть только программа, и я запускаю одну и ту же программу в 7 разных Windows (терминалах). Все 7 экземпляров, которые я запускаю, имеют 7 разных номеров сокетов, и сейчас создано семь серверов.

Все терминалы (Сервер) в этот момент ждут ввода с клавиатуры, И я выбрал в одном из терминалов и Ввод в одном терминале, Но остальные все терминалы все еще ждут прерывания клавиатуры (ввода) (это очевидно).

Теперь терминал, который я выбрал, знает идентификатор однорангового узла (порт сокета нет других терминалов/сервера). Итак, теперь я хочу отправить сообщение другим одноранговым узлам (терминалам), проблема в том, что они все еще ждут прерывания клавиатуры!

Как мне это решить? По сути, я хочу, чтобы остальные все терминалы перестали ждать ввода с клавиатуры, если в одном из терминалов введен ввод с клавиатуры (Примечание: у меня есть все порты сокетов остальных)

Это UDP-соединение


person user2528042    schedule 22.10.2013    source источник
comment
У вас есть код для сервера, ожидающего ввода с клавиатуры, а также как они открывают сокеты? Это поможет людям ответить на ваш вопрос.   -  person justhalf    schedule 22.10.2013
comment
@justhalf какая-то беда   -  person user2528042    schedule 22.10.2013
comment
Потому что в вашем нынешнем состоянии трудно точно определить проблему, которая у вас есть. Как сказал Дхаиват Пандья, решение состоит в том, чтобы позволить серверу отправлять сообщение другим серверам. Если ваш вопрос заключается в том, как это сделать, нам нужно увидеть архитектуру вашего кода, чтобы иметь возможность ответить на него правильно.   -  person justhalf    schedule 22.10.2013


Ответы (2)


Вам нужно, чтобы все эти серверы общались друг с другом (я предполагаю, что у вас есть веская причина для того, чтобы все они были отдельными программами). Для этого между каждым процессом должен быть сокет или межпроцессное взаимодействие.

Проверьте ZeroMQ или RabbitMQ. чтобы помочь вам реализовать это более надежно.

Обратите внимание, что протоколы P2P не совсем просты в реализации.

person Dhaivat Pandya    schedule 22.10.2013
comment
Чувак, я знаю программирование сокетов, а также я сказал, что у меня есть номера портов всех серверов... Так что это не ответ на вопрос, не могли бы вы проверить вопрос еще раз? :) - person user2528042; 22.10.2013

Вы смотрели на http://docs.python.org/2/library/signal.html ? Вы можете отправить сообщение другим экземплярам сервера после установки обработчика события.

Вы можете использовать http://docs.python.org/2/library/os.html#os.kill для отправки сигналов между процессами.

person timcour    schedule 22.10.2013
comment
На 7 разных Windows (терминалах) - person John La Rooy; 22.10.2013
comment
Упс, не понял, что os.kill работает только тогда, когда процессы находятся только в одном терминале :(. - person timcour; 22.10.2013
comment
@timcour любой другой метод? - person user2528042; 22.10.2013
comment
Вы можете запустить подпроцесс для прослушивания ввода с клавиатуры, а затем настроить основной поток для прослушивания в сокете сигнала прерывания, который будет отправлен экземпляром, получившим ввод с клавиатуры, всем другим запущенным экземплярам. Но тогда вам нужно будет отслеживать все сокеты, на которых работают серверы. - person timcour; 22.10.2013
comment
Другая идея — использовать Redis. Каждый работающий сервер сможет подписаться на сообщения на указанном канале с настроенным обратным вызовом, вызываемым при публикации сообщения на канале. Сервер, получающий ввод с клавиатуры, сможет опубликовать сообщение на этом канале при вводе с клавиатуры... Близко ли одно из этих решений к тому, что вы ищете? - person timcour; 22.10.2013