2013-03-01 2 views
0

Я использую BaseManager для совместного использования очереди с пулом рабочих процессов. Я вызываю start() на нем, чтобы менеджер работал в другом потоке.Многопроцессорное завершение работы BaseManager() занимает двадцать секунд

В разделе shutdown() документация гласит: «Это доступно только в том случае, если для запуска процесса сервера был использован start()». Однако, если я вызываю shutdown(), процесс переднего плана будет блокировать процесс менеджера за двадцать секунд до завершения, каждый раз. Если я не вызываю shutdown(), процесс переднего плана уходит немедленно?

Что мне не хватает?

Также есть ли у кого-нибудь идеи, почему в документации говорится: «Это можно назвать несколько раз»? Почему вы отправляете несколько сигналов выключения в процесс менеджера?

ответ

1

Ожидает 20 секунд по дизайну. Пожалуйста, refer here для получения дополнительной информации

 process.join(timeout=0.2) 
     if process.is_alive(): 
      util.info('manager still alive') 
      if hasattr(process, 'terminate'): 
       util.info('trying to `terminate()` manager process') 
       process.terminate() 
       process.join(timeout=0.1) 
       if process.is_alive(): 
        util.info('manager still alive after terminate') 
+0

Я ничего не вижу в вызове выключения или создании процесса, указывающего задержку. Что заставляет вас думать, что это по дизайну? Когда я не вызываю shutdown(), никакие процессы, кажется, остаются открытыми. Я сомневаюсь в важности даже вызова. –

+1

Выключение вызывает 'util._run_finalizers (0)' для запуска финализаторов, которые были объявлены для процесса запуска. Теперь, если вы хотите обратиться к защите от запуска, вы заметите, что есть регистрация финализаторов, которые называет '_finalize_manager', который имеет параметр таймаута, используемый при ожидании автоматического закрытия диспетчера, прежде чем прибегать к завершению() –

+0

Отлично. Спасибо за это разъяснение, Тревис. –

Смежные вопросы