2015-01-30 16 views
5

Ho un'operazione di blocco in una libreria di terze parti che non controllo. Potrebbe potenzialmente andare per sempre. Quindi voglio impostare un timeout su di esso. Il modo ovvio è di avvolgerlo con un canale e una goroutine e quindi selezionare il risultato con time.After. Tuttavia, il problema è che la goroutine che esegue l'operazione di blocco potrebbe potenzialmente andare per sempre.annullare un'operazione di blocco in Go

Ecco un esempio per illustrare questo http://repl.it/90o

C'è un modo per annullare una goroutine o far garbage collection?

+2

La libreria di terze parti è open source? Forse puoi aggiustarlo per loro e inviare una richiesta di pull. – tgrosinger

risposta

3

Non è possibile interrompere una goroutine dall'esterno. La goroutine deve supportare un tipo di segnalazione di terminazione (il più delle volte un canale). Ma se non lo fa, non puoi forzarlo o ucciderlo.

Se non si può fare nulla sulla lib di terze parti che si sta utilizzando, la maggior parte che si può fare è eseguirla in un processo diverso (in un'applicazione diversa avviata dalla propria app) che è possibile eliminare, ma è solo brutto e troppo macchinoso.

0

Non penso che tu possa fare nulla. In Go non puoi fermare una goroutine da fuori. Se non riesci a riparare questa libreria e pensi che potrebbe bloccarsi per sempre, allora scrivine una nuova che sarai in grado di controllare.