В вашем реальном приложении вы можете переключиться на многопроцессорность?Кажется, что то, что вы просите, может быть сделано с multiprocessing
+ threading.Timer
+ try/except
.
Взгляните на это:
class SafeProcess(Process):
def __init__(self, queue, *args, **kwargs):
self.queue = queue
super().__init__(*args, **kwargs)
def run(self):
print('Running')
try:
result = self._target(*self._args, **self._kwargs)
self.queue.put_nowait(result)
except:
print('Exception')
result = None
while result != 'it worked!!':
q = Queue()
p = SafeProcess(q, target=unreliable_code)
p.start()
t = Timer(1, p.terminate) # in case it should hang
t.start()
p.join()
t.cancel()
try:
result = q.get_nowait()
except queues.Empty:
print('Empty')
print(result)
Это в одном (счастливом) случае дало мне:
Running
Empty
None
Running
it worked!!
В ваших примерах кода у вас есть 4 из 5 шансов получить ошибку, поэтому вы также можете создать пулили что-то, что повысит ваши шансы на получение правильного результата.