Задать вопрос
@skymike

Поведение упавшего потока?

Суть такая, есть функция воркер, которая через threading.Thread(target=worker).start() запускается в количестве 2 штут, воркеры эти берут задания из очереди и спокойно их обрабатывают. Если воркер 1 завершил обработку он завершается и запускается из цикла опять со следующим свободным значением из очереди, точно также ведёт себя и второй воркер, время обработки данных у них может отличатся. Вопрос вот в чём, если например воркер 1 свалится изза exception какого нибудь, не завершив коректно задания, то он потом нормально перезапустится?

код примерно такой:
q = queue.Queue()

def worker():
    while True:
            if q.empty():
                exit() ### если очередь пуста то выходим
            u = q.get() ### получаем значение из очереди
            ### тут усиленно пыхтим над данными  ###
            q.task_done() ### Сообщаем что задание выполнено

### этим циклом добавляем задания в очередь
for i in job_list:
    q.put(i)

### запуск 2 потоков
for x in range(2):
    threading.Thread(target=worker).start()

В этом коде опустил блоки try, при падении воркер пишет в файл на каком задании он свалился, но наблюдая за програмой я так и не понял, может он после падения опять рестартонуть или нет. падает довольно редко. Как расмотреть его поведение?

Как это понимаю я, по идее q.get() получив задание из очереди он его удалит из очереди, то свалившийся воркер, уже получивший задание, просто не завершит свою обработку, но в цикле запуска должен перезапусится опять взяв следующее задание из очереди.
  • Вопрос задан
  • 76 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
используйте Celery для Вашей задачи
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы