def __init__(self, input_file, output_file): # Очередь задач. Записывает - reader. Читает - manager. self.jobs_queue = mp.Queue(maxsize=1000) # Итератор по очереди задач. С возможностью остановки извне. self.jobs_iter = QueueIter(self.jobs_queue) # Очередь результатов. Записывает - manager. Читает - writer. results_queue = mp.Queue() # инициализируем компоненты: self.components = { 'reader': Reader(input_file, self.jobs_queue), 'writer': Writer(output_file, results_queue), 'coordinator': Coordinator(SOCK_NAME), 'manager': Manager(self.jobs_iter, results_queue, SOCK_NAME), } log.info('Components initialized.')
def start(self): # запускаем их все и надеемся, что взлетим... for component_instance in self.components.values(): component_instance.start() log.info('Components started.') # ждем пока дочитается файл self.components['reader'].join() log.info('Reached end of input file.') log.debug('Reader alive: %s' % self.components['reader'].is_alive()) # ждем пока рабочие разберут все задачи из очереди while not self.jobs_queue.empty(): time.sleep(1) log.debug('Jobs queue is empty.') # тормозим итератор задач self.jobs_iter.stop() log.debug('Stopping jobs iterator.') # ждем пока остановится менеджер self.components['manager'].join() log.info('Manager finished.') log.debug('Manager alive: %s' % self.components['manager'].is_alive()) # останавливаем остальные компоненты log.debug('Trying to stop writer.') self.components['writer'].stop() log.debug('Trying to stop coordinator.') self.components['coordinator'].stop() time.sleep(2) log.debug('Writer alive: %s' % self.components['writer'].is_alive()) log.debug('Coordinator alive: %s' % self.components['coordinator'].is_alive()) log.info('All components stopped.') # если сюда добрались - значит все ОК и код возврата = 0 return 0