Example #1
0
    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.')
Example #2
0
    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