Как вы можете защитить себя от нестабильного библиотечного вызова, который может зависать бесконечно?

Предположим, вы оказались в неудачном положении, когда вы зависите от плохо управляемой библиотеки. Ваш код должен вызывать FlakyClient.call (), но иногда эта функция зависает на недопустимое количество времени.

Как показано ниже, один из способов это обернуть вызов в его собственныйПроцесси используйте параметр времени ожидания вприсоединиться метод, чтобы определить максимальное количество времени, которое вы готовы ждать на FlakyClient. Это обеспечивает хорошую защиту, но также предотвращает реакцию основной части кода на результат вызова FlakyClient.call (). Единственный известный мне способ решения этой другой проблемы (получения результата в основной части кода) - использование некоторого громоздкого метода IPC.

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

Спасибо!

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