¿Cómo puede protegerse de una llamada de biblioteca escamosa que podría colgar indefinidamente?

Suponga que se encuentra en la desafortunada posición de depender de una biblioteca con un mal comportamiento. Su código debe llamar a FlakyClient.call (), pero a veces esa función termina suspendida por una cantidad de tiempo inaceptable.

Como se muestra a continuación, una forma de evitar esto es envolver la llamada en su propioProcesoy utilice el parámetro de tiempo de espera en elunirse método para definir la cantidad máxima de tiempo que está dispuesto a esperar en FlakyClient. Esto proporciona una buena protección, pero también evita que el cuerpo principal del código reaccione al resultado de llamar a FlakyClient.call (). La única manera que conozco de abordar este otro problema (obtener el resultado en el cuerpo principal del código) es mediante el uso de alguna técnica engorrosa de IPC.

¿Cuál es una forma limpia y pitónica de tratar estos dos problemas? Quiero protegerme si la llamada a la biblioteca se cuelga y poder usar el resultado si la llamada se completa.

¡Gracias!

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().")