В чем разница между BeginConnect и ConnectAsync?

В чем разница между 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-адрес канала", по которому следует приходить для сообщений.

Дополнительные требования: цикл.

  • Доставка сообщений должна быть гарантирована, и она должна доходить до каждого работника, который слушает.
  • Рабочий должен иметь возможность отслеживать сообщения без блокировки - в идеале с помощью цикла опроса / выбора / любого другого, упомянутого выше.
  • В идеале рабочий процесс должен быть "серверным" в определенном смысле - он не должен беспокоиться о том, чтобы соединения с "канальным сервером" (если есть) были постоянными и т. Д. - или это должно быть сделано прозрачно фреймворком.
  • 7
    задан Alexander Gladysh 23 April 2011 в 15:29
    поделиться