Como você pode se proteger de uma chamada superficial da biblioteca que pode travar indefinidamente?

Suponha que você se encontre na posição infeliz de ter uma dependência de uma biblioteca mal comportada. Seu código precisa chamar FlakyClient.call (), mas às vezes essa função acaba travando por um período inaceitável.

Como mostrado abaixo, uma maneira de contornar isso é encerrar a chamada por conta própriaProcessoe use o parâmetro timeout noJunte-se método para definir a quantidade máxima de tempo que você deseja esperar no FlakyClient. Isso fornece uma boa proteção, mas também impede que o corpo principal do código reaja ao resultado da chamada de FlakyClient.call (). A única maneira que conheço de resolver esse outro problema (obter o resultado no corpo principal do código) é usar alguma técnica complicada de IPC.

Qual é uma maneira limpa e pitônica de lidar com esses dois problemas? Quero me proteger se a chamada da biblioteca travar e poder usar o resultado se a chamada for concluída.

Obrigado!

from multiprocessing import Process
from flaky.library import FlakyClient


TIMEOUT_IN_SECS = 10

def make_flaky_call():
    result = FlakyClient.call()

proc = Process(target=make_flaky_call)
proc.start()
proc.join(TIMEOUT_IN_SECS)
if proc.is_alive():
    proc.terminate()
    raise Exception("Timeout during call to FlakyClient.call().")

questionAnswers(2)

yourAnswerToTheQuestion