Выйти из многопоточного / многопроцессорного веб-сервера - PullRequest
0 голосов
/ 24 марта 2012

Я программирую http-сервер. Существует главный демон, порождающий группу слушателей, которые являются потоками или процессами, в зависимости от пользовательских настроек. После создания слушателя ему передается дескриптор сокета, и его задача - просто прослушивать соединения (дух). Семафор оборачивает вызов к listen, чтобы избежать эффекта громового стада.

Моя проблема в том, как выйти из сервера. В этой ситуации, когда слушатели заблокированы на семафоре, как демон скажет им закрыться? Демон не может просто убить их, может быть, кто-то отвечает на запрос ...

Я хочу максимально упростить дизайн, но не могу найти решение этой проблемы.

Вот несколько уродливых обходных путей:

  • Установить таймаут для семафора. Просыпайся. Должен ли я закрыть? Нет? Хорошо, снова спать;
  • Просто убей их;
  • Массив логических значений в разделяемой памяти, то есть отвечающий / заблокированный, демон соответственно убивает. Пока лучшее, но не так просто.

Что вы говорите? Благодаря.

Ответы [ 3 ]

1 голос
/ 25 марта 2012

Отправьте SIGTERM или, если хотите, SIGUSR детям и осуществите обработку этого сигнала, чтобы они завершили текущий запрос и изящно завершили работу. Если они ждут семафора, вы должны использовать режим прерывания, чтобы после получения сигнала их разбудили.

1 голос
/ 25 марта 2012

Простой способ решить эту проблему - заставить каждого слушателя ждать два семафора.Первый - текущий, который вы сейчас используете, а второй - когда появляется сигнал, означает, что пришло время выйти.Я считаю, что ваша система Linux, так как вы использовали термин daemon.Функция select делает именно это - ожидает нескольких объектов (например, файловых дескрипторов) и возвращает, когда один из них становится сигнальным.Вы также знаете из функции, какая из них получила сигнал, так что вот ваше решение.

В Windows функция WaitForMultipleObjects()

0 голосов
/ 25 марта 2012

В прошлом я использовал глобальную переменную, которую клиентские потоки могли бы использовать, чтобы выяснить, нужно ли им «очистить магазин», а затем дождался их завершения, но мне также было бы интересно узнать, есть ли даже лучше. (Не знаю, на каком языке, но на большинстве, вы можете проверить, работает ли ваш поток.) ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...