Dans le module multitraitement de Python, les événements KeyboardInterrupt ne parviennent apparemment pas à mettre fin aux processus de travail au sein d'un pool. Considérez l'extrait de code :
<code class="python">from multiprocessing import Pool from time import sleep from sys import exit def slowly_square(i): sleep(1) return i*i def go(): pool = Pool(8) try: results = pool.map(slowly_square, range(40)) except KeyboardInterrupt: # **** THIS PART NEVER EXECUTES. **** pool.terminate() print "You cancelled the program!" sys.exit(1) print "\nFinally, here are the results: ", results if __name__ == "__main__": go()</code>
Lorsque vous appuyez sur Ctrl C pour déclencher une interruption de clavier, le code se bloque indéfiniment au lieu de terminer correctement le pool. Cela est dû à un bug Python qui empêche KeyboardInterrupt d'interrompre les appels à threading.Condition.wait().
Solution de contournement :
Une solution de contournement consiste à spécifier un délai d'attente. pour les opérations du Pool. Remplacez :
<code class="python"> results = pool.map(slowly_square, range(40))</code>
par :
<code class="python"> results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
En spécifiant un délai d'attente arbitrairement long, vous supprimez efficacement le comportement de blocage et permettez à l'interruption d'être traitée rapidement. Cela entraînera la fermeture gracieuse de tous les processus de travail lorsque Ctrl C est enfoncé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!