Можно ли отправить одно сообщение на несколько принимающих сокетов за постоянное время? - PullRequest
0 голосов
/ 07 сентября 2018

Это больше касается общей стороны, но в последнее время у меня возникла необходимость отправлять много сообщений, полученных через API WebSocket, нескольким дочерним процессам через доменные сокеты UNIX в python. Чистые потоки не являются альтернативой, поскольку мне нужен истинный параллелизм (надеюсь, я не путаю его с параллелизмом), поэтому остаются только процессы. Совместное использование памяти между основными и дочерними процессами приводит к большим издержкам, чем просто прослушивание всех их в своем собственном сокете.

Процедура выглядит следующим образом:

  1. Поток в основном процессе прослушивает входящие сообщения WebSocket и помещает их в очередь
  2. Главный процесс busy-spins и проверяет наличие новых сообщений в очереди, если он есть, он отправляет его нескольким (возможно, 3-4) дочерним процессам.

После профилирования приведенного выше сценария я обнаружил, что для отправки сообщения требуется около 3 мсек на дочерний процесс. Учитывая необходимость высокой пропускной способности, я бы предпочел подождать 3 мсек на сообщение, а не 9 мсек в случае 3 дочерних процессов. Будет ли возможность сократить это время с O (n) до O (1)?

Пока на ум приходит только асинхронность, но я бы не хотел использовать ее, если это возможно.

1 Ответ

0 голосов
/ 07 сентября 2018

Если вы можете создать фиксированный набор дочерних процессов, т. Е. В наборе есть 3 / n процессов, и вы выбираете набор и пересылаете его всем, тогда вы можете рассмотреть возможность использования одного многоадресного IP / сокета на набор дочерних процессов.

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

Multicast IP выполняет широковещательную рассылку уровня 2, поэтому пакет передается только один раз по проводной сети, и все сокеты в группе многоадресной рассылки одновременно читают одно и то же сообщение.

...