Gestion des interruptions du clavier dans les pools multitraitements avec Python
La gestion des interruptions du clavier est cruciale pour gérer efficacement les processus parallèles. La bibliothèque multitraitement permet de créer un pool de processus de travail pouvant exécuter des tâches simultanément. Cependant, un problème survient lorsqu'une KeyboardInterrupt est initiée lors de l'exécution de ces processus.
Problème :
Dans le code Python donné, un Pool est créé et une tentative est conçu pour gérer les interruptions de clavier à l'aide d'un bloc try-sauf. Cependant, le code correspondant dans le bloc except ne s'exécute jamais, laissant le programme suspendu.
<code class="python">try: results = pool.map(slowly_square, range(40)) except KeyboardInterrupt: pool.terminate() print("You cancelled the program!") sys.exit(1)</code>
Cause :
Ce problème est causé par un bug dans Python où Les KeyboardInterrupts ne sont pas envoyées lors de l'attente d'une condition dans threading.Condition.wait(). Dans la bibliothèque multitraitement, le Pool utilise une variable de condition pour attendre les résultats de l'opération map(). Lorsqu'une KeyboardInterrupt se produit, la variable de condition wait() ne revient pas, empêchant ainsi la gestion de l'interruption.
Solution :
Pour résoudre ce problème, une solution de contournement est de spécifier un délai d'attente lors de l'attente des résultats. Ceci peut être réalisé en remplaçant l'appel map() par map_async().get(timeout), où le délai d'attente est défini sur une valeur élevée.
<code class="python">results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
En spécifiant un délai d'attente, la variable de condition wait() reviendra même si le KeyboardInterrupt n’a pas été traité. Cela permet au bloc except de s'exécuter, permettant la terminaison du pool et la gestion gracieuse de l'interruption.
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!