Здесь идет сценарий: у меня есть родительский процесс, который породил пару дочерних процессов. Теперь каждому подпроцессу должно быть разрешено работать в течение двух секунд (время процессора в идеале), после чего родитель заставляет детей спать или выполняет некоторую работу. Этот цикл продолжается. Также некоторые подпроцессы могут быть прекращены между ними. Подпроцесс, который будет создан, - это код, написанный каким-то ненадежным человеком. (Эта проблема напоминает мне о циклической диспетчеризацией)Как планировать подпроцессы?
Мои решения и исследования:
Очевидное решение: Положите родителя спать в течение двух секунд, а затем просыпаются и контролировать детей. Здесь мы идем со стеной, и каждый процесс может не получить справедливые две секунды времени выполнения.
Решение второе: используйте prlimit() с RLIMIT_CPU и установите большую жесткость и softlimit как две секунды изначально. Впоследствии мягкая граница может быть увеличена на две секунды. Затем подпроцесс получает сигнал SIGXCPU.
Каждому процессу может быть присвоен другой сигнал (сигнал в реальном времени) (попадает в верхний предел 33). Теперь, получив сигнал SIGXCPU, назначенный сигнал должен быть отправлен родителям с помощью os.kill(). Здесь проблема заключается в том, что подпроцесс должен добровольно отправить сигнал родительскому элементу. Подпроцесс может получить дополнительное время, посылая сигнал поздно.
Решение три: Используйте метод setitimer() с ITIMER_VIRTUAL из дочернего процесса. Сигнал SIGVTALRM отправляется дочернему процессу. Он должен передать другому сигналу (как описано выше) к родительскому процессу. Эти решения имеют те же проблемы, что и в предыдущем решении.
Все три решения - это катастрофы. Я ищу лучшие решения. Некоторый минимальный код для объяснения будет очень полезен.
I ребенок печатает и завершает работу, тогда родитель будет ждать бесконечно! Таким образом, измерение времени процессора плохое. –
Я пришел к выводу, что использование процессорного времени не является разумным, и что касается времени на стене, я думаю, что вопрос все еще стоит. –