Se si invia una funzione a ThreadPoolExecutor
, l'esecutore eseguirà la funzione in un thread e ne memorizzerà il valore di ritorno nell'oggetto Future
. Poiché il numero di thread simultanei è limitato, è possibile annullare in attesa dell'esecuzione di in attesa di un futuro, ma una volta passato il controllo nel thread di lavoro al callable, non c'è modo di interrompere l'esecuzione.
Considerate questo codice:
import concurrent.futures as f
import time
T = f.ThreadPoolExecutor(1) # Run at most one function concurrently
def block5():
time.sleep(5)
return 1
q = T.submit(block5)
m = T.submit(block5)
print q.cancel() # Will fail, because q is already running
print m.cancel() # Will work, because q is blocking the only thread, so m is still queued
In generale, ogni volta che si vuole avere qualcosa annullabili voi stessi siete responsabili per fare in modo che sia.
Esistono tuttavia alcune opzioni disponibili. Es., considerare l'utilizzo di asyncio, anche have an example using sleep. Il concetto aggira il problema, ogni volta che qualsiasi operazione potenzialmente bloccante deve essere chiamata, invece di restituire il controllo a un loop di controllo in esecuzione nel contesto più esterno, insieme a una nota che l'esecuzione dovrebbe essere continuata ogni volta che il risultato è disponibile - o, in il tuo caso, dopo che sono passati i n
secondi.
risposta breve - in nessun modo, e molto probabilmente l'uso del sonno nei lavoratori significa problema con il design, risposta lunga - è sempre possibile implementare il sonno personalizzato con possibilità di romperli, tuttavia non è né piratonico né corretto. in alternativa è possibile verificare l'utilizzo del blocco. – Reishin