Как «сигнализировать» заинтересованным дочерним процессам (без сигналов)? - PullRequest
1 голос
/ 10 мая 2010

Я пытаюсь найти хороший и простой метод для сигнализации дочерних процессов. (созданный через SocketServer с ForkingMixIn) от родительского процесс.

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

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

Ответы [ 2 ]

3 голосов
/ 10 мая 2010

Поскольку вы работаете в системе Unix, семафоры должны быть простым ответом. К сожалению, python, похоже, не предлагает способ вызова системного вызова semop.

Если вы используете Python 2.6, вы можете использовать многопроцессорный модуль Класс условий.

2 голосов
/ 10 мая 2010

Мне пришла в голову идея использовать дескриптор файла канала, который родительский объект мог бы написать, а затем прочитать / сбросить в сочетании с select, но на самом деле это не очень элегантный дизайн.

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

Как я уже сказал, это кажется странным и безобразным, но я пока не нашел ничего лучшего.

Edit:

Оказывается, это не работает - некоторые дочерние процессы проснулись, а некоторые нет. Я прибег к использованию Condition из модуля multiprocessing.

...