Я пытаюсь найти хороший и простой метод для сигнальных процессов (созданный через SocketServer с помощью ForkingMixIn) из родительского процесс.
В то время как сигналы Unix могут использоваться, я хочу избежать их, поскольку только дети, которые заинтересованы, должны получить сигнал, и это будет чрезмерное и сложное требование какой-либо регистрации механизм для идентификации заинтересованного родительского процесса.
(Пожалуйста, не предлагайте темы, так как эта конкретная программа не будет работать с потоками и, следовательно, должен использовать вилки.)
Поскольку вы находитесь в системе unix, семафоры должны быть легким ответом. К сожалению, python, похоже, не предлагает способ вызова системного вызова semop.
Если вы используете python 2.6, вы можете использовать модуль многопроцессорности Класс условий.
Я придумал использовать дескриптор файла pipe, который родитель мог написать, а затем читать/скрывать в сочетании с select, но это не очень квалифицируется как очень элегантный дизайн.
Более подробно: родитель создавал бы канал, подпроцессы наследовали бы его, родительский процесс записывал бы в трубу, тем самым пробуждая любой подпроцесс select()
: ing на дескрипторе файла, но потом родитель немедленно прочитайте с прочитанного конца трубы и опорожните его - единственным эффектом является то, что те дочерние процессы, которые были select()
: на трубе, проснулись.
Как я уже сказал, это кажется странным и уродливым, но я еще ничего не нашел.
Edit:
Оказывается, это не работает - некоторые дочерние процессы разбужены, а некоторые нет. Я прибегал к использованию Condition
из модуля multiprocessing
.