Ищете лучший способ справиться с исключениями в потоке, который принимает элемент из очереди, где, если он выйдет из строя, пока у него есть элемент, состояние очереди будет уничтожено, потому что элемент очереди навсегда занят, очередь будет 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))