Comment gérer les interruptions de clavier dans les pools multitraitements avec Python ?

DDD
Libérer: 2024-10-22 16:35:02
original
985 Les gens l'ont consulté

How to Handle Keyboard Interruptions in Multiprocessing Pools with Python?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal