Supponiamo di trovarti nella sfortunata posizione di avere una dipendenza da una libreria con cattive abitudini. Il tuo codice deve chiamare FlakyClient.call(), ma a volte tale funzione finisce per impiccarsi per una quantità di tempo inaccettabile.Come si può salvaguardare da una chiamata di libreria traballante che potrebbe bloccarsi indefinitamente?
Come mostrato di seguito, un modo per aggirare questo è quello di avvolgere la chiamata nel proprio processo , e utilizzare il parametro timeout nel unirsi metodo per definire un tempo massimo che siete disposti ad aspettare il FlakyClient. Ciò fornisce una buona protezione, ma impedisce anche che il corpo principale del codice reagisca al risultato della chiamata a FlakyClient.call(). L'unico modo che conosco per affrontare questo altro problema (ottenere il risultato nel corpo principale del codice) è usare una tecnica ingombrante di IPC.
Qual è un modo pulito e pitonico per gestire questi due problemi? Voglio proteggermi se la chiamata alla libreria si blocca, ed essere in grado di usare il risultato se la chiamata termina.
Grazie!
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().")
È possibile utilizzare thread o costrutti leggeri come greenlet. –
Invece di aspettare, potresti chiamarlo un po 'prima, quindi ne avrai bisogno e vedrai se ha terminato l'elaborazione prima che sia necessario? –
Mi piace pensare che questa domanda possa essere meglio risolta usando i cicli degli eventi di 'asyncio' ed eseguendo le funzioni in modo asincrono (si veda [esempio] (http://stackabuse.com/python-async-await-tutorial/)), ma 'asyncio' non è disponibile prima di Python 3.4. –