В чем разница между BeginConnect
и ConnectAsync
? но это не должно иметь значения). Я бы предпочел решение на основе ZeroMQ, но приму все достаточно разумное. Примечание: по техническим причинам я могу ...
Контекст: ОС: Linux (Ubuntu), язык: C (на самом деле Lua, но это не имеет значения).
Я бы предпочел решение на основе ZeroMQ, но принимайте что-нибудь достаточно разумное.
Примечание: по техническим причинам я не могу использовать здесь сигналы POSIX.
У меня есть несколько идентичных долгоживущих процессов на одной машине («рабочие»).
Время от времени я необходимо доставить управляющее сообщение каждому из процессов с помощью инструмента командной строки. Пример:
$ command-and-control worker-type run-collect-garbage
Каждый из рабочих процессов на этом компьютере должен получить сообщение run-collect-garbage
. Примечание: было бы идеально, если бы решение каким-то образом работало для всех рабочих на всех машинах в кластере, но я могу написать эту часть сам.
Это легко сделать, если я сохраню некоторую информацию о запущенных воркерах. Например, храните для них PID в известном месте и открывайте управляющий сокет домена Unix на известном пути с где-нибудь в нем PID. Или откройте сокет TCP и где-нибудь сохраните хост и порт.
Но это потребует тщательного управления сохраненной информацией - например, что, если рабочий процесс внезапно завершится? (Ничего неуправляемого, но все же дополнительная возня.) Кроме того, информацию нужно где-то хранить, что добавляет немного сложности.
Есть ли хороший способ сделать это в стиле PUB / SUB? То есть рабочие - это подписчики, средство управления - это издатель, и все, что они знают, - это, так сказать, единственный "URL-адрес канала", по которому следует приходить для сообщений.
Дополнительные требования: цикл.