Как бороться с извлечением потока из очереди и сбоями? - PullRequest
0 голосов
/ 19 июня 2020

Ищете лучший способ справиться с исключениями в потоке, который принимает элемент из очереди, где, если он выйдет из строя, пока у него есть элемент, состояние очереди будет уничтожено, потому что элемент очереди навсегда занят, очередь будет never join (), et c.

У меня есть поток, который выглядит примерно так, как показано ниже. Работа, которую он выполняет, может быть достаточно длительной и включать в себя множество внешних вызовов API, которые могут дать сбой. Я улавливаю кучу исключений, которые вызываются этими вызовами API, но я до сих пор не знаю, какие странные ошибки / исключения могут произойти в этом потоке.

Проблема в том, что если происходит исключение, я не знаю ' t предсказал, он может sh захватить этот поток, пока он удерживает элемент очереди, и тогда этот элемент никогда не получит процесс, и queue.join () будет ждать вечно.

Есть ли общий подход к этому проблема? Конечно, я мог бы иметь общий захват всех исключений в потоке, чтобы убедиться, что задача либо помечена как выполненная, либо возвращена в очередь, но это не кажется чистым подходом.

У меня был быстро взгляните на документы очереди, но я не вижу ничего очевидного в том, что очередь может ждать обработки элемента и втягивать его обратно в очередь, если это не так, что похоже на то, что мне нужно , возможно.

def worker(myId, wStopping, jobQueue, timeOut, logging, drive):

    logging.info("Starting Worker ID " + str(myId))

    while not wStopping.is_set():

        try:
            job = jobQueue.get(True, timeOut)
        except queue.Empty:
            continue

        doWork = ( init big job)
        doWork.  (run job job) # many exceptions caught well inside here, some strange ones may not be

        jobQueue.task_done()        

    logging.info("Ending Worker " + str(myId))
...