


Utilisez du pool de threads pour exécuter simultanément les processus d'enfants pour améliorer l'efficacité
Cet article vise à introduire comment utiliser le module de sous-processus de Python pour exécuter plusieurs sous-processus simultanément et améliorer considérablement l'efficacité d'exécution du programme via des pools de threads. Nous analyserons les scénarios communs à l'aide des méthodes Sub-Process.popen et .Communicate () et fournir un exemple de code pour utiliser Threadpool pour attendre que le processus enfant se termine simultanément.
Lors de l'exécution de plusieurs sous-processus à l'aide du module de sous-processus, une idée fausse commune est que la fonction POPEN bloque l'exécution du programme. En fait, la fonction POPEN n'est pas bloquante et il renverra immédiatement un objet POPEN, permettant au programme de continuer à exécuter. Cependant, la méthode communicate () de l'objet POPEN bloque, ce qui attend que le processus de l'enfant termine l'exécution et renvoie sa sortie. Si la méthode communicate () est appelée en séquence dans une boucle, elle entraînera en fait les processus d'enfants séquentiellement, réduisant ainsi l'efficacité du programme.
Pour résoudre ce problème, un pool de fils peut être utilisé pour attendre simultanément que le processus de l'enfant se termine. Un pool de threads peut créer plusieurs threads, chaque thread est responsable de l'attente d'un processus d'enfant. De cette façon, plusieurs sous-processus peuvent être exécutés simultanément, améliorant ainsi l'efficacité d'exécution du programme.
Voici un exemple de code qui utilise un pool de threads pour attendre simultanément que le processus enfant se termine:
sous-processus d'importation journalisation d'importation à partir de multiprocessement. Logging.basicConfig (niveau = logging.debug, format = '% (asctime) s -% (niveau) s -% (message) s') log = logging.getLogger (__ name__) Def RunshowCommands (CMDTable) -> Dict: "" "Renvoie un dictionnaire de sortie capturée des commandes définies dans cmdtable." "" procountput = {} # Dict pour stocker le texte de sortie des commandes Show prochandles = {} Pour CMD, commande dans cmdtable.items (): essayer: log.debug (f "Sous-processus en cours d'exécution {cmd} - {commande}") prochandles [cmd] = sub-process.popen (commande, stdout = sub-process.pipe, stderr = sub-process.pipe, shell = true) sauf exception comme e: log.Error (f "Erreur Lancement de sous-processus {cmd}: {e}") Continuer à continuer def handle_proc_stdout (manche): essayer: proc = prochandles [manche] stdout, stderr = procc.communicate (timeout = 180) procountput [manche] = stdout.decode ("utf-8") # transformez la partie stdout en texte log.debug (f "Sous-processus renvoyé {handle}") Si stderr: Log.Error (f "Sub-Process {manche} Renvoyé stderr: {stderr.decode ('utf-8')}") Sauf Sub-Process.TimeoutExpired: Log.Error (f "Sous-processus {manche} timed out") proc.kill () # terminer le processus sauf exception comme e: log.Error (f "Sous-processus de gestion des erreurs {manche}: {e}") Threadpool = Threadpool () threadpool.map (handle_proc_stdout, prochandles.keys ()) threadpool.close () Threadpool.join () Retour ProTutput Si __Name__ == '__MAIN__': cmdTable = { 'Himom': "Echo Salut maman", 'Au revoir': "Echo Goodbye", 'Date': "Date", 'Sleep': "Sleep 2 && echo dormait" } Output = RunshowCommands (CMDTable) pour CMD, Out in Output.items (): print (f "sortie de {cmd}: \ n {out}")
Explication du code:
-
Fonction RunshowCommands (CMDTable):
- Accepte un dictionnaire cmdtable où la clé est le nom de la commande et la valeur est la chaîne de commande à exécuter.
- Créez un dictionnaire vide ProCutput pour stocker la sortie de chaque commande.
- Créez un dictionnaire vide Prochandles pour stocker chaque objet POPEN.
- Boucle via chaque commande dans CMDTable:
- Utilisez Sub-Process.popen pour démarrer le processus de l'enfant et rediriger Stdout et Stderr vers le pipeline. shell = true permet une exécution directe des commandes de chaîne, mais faites attention à la sécurité.
- Store l'objet POPEN dans le dictionnaire Prochandles, la clé est le nom de commande.
- Définissez une fonction interne Handle_Proc_stdout (manche):
- Cette fonction est responsable du traitement de la sortie d'un seul processus d'enfant.
- Utilisez Prochandles [Handle] .ComminiCate (timeout = 180) pour obtenir la sortie du processus de l'enfant et définir le délai d'expiration à 180 secondes.
- Décodez la sortie dans une chaîne UTF-8 et stockez-la dans le dictionnaire ProTutput.
- Enregistre les messages renvoyés par le processus de l'enfant.
- Gérez l'exception de tempsout, si le processus de l'enfant a expiré, une erreur est enregistrée et le processus est terminé.
- Gérez les autres exceptions et enregistrez un message d'erreur si une autre erreur se produit.
- Créez un objet Threadpool.
- Utilisez threadpool.map (handle_proc_stdout, prochandles.keys ()) pour appliquer la fonction handle_proc_stdout à chaque clé (nom de commande) dans le dictionnaire Prochandles. Cela exécute la fonction Handle_Proc_stdout en parallèle dans le pool de threads.
- Appelez Threadpool.close () pour empêcher que plus de tâches soient soumises au pool de threads.
- Appelez Threadpool.join () pour attendre que tous les threads se terminent.
- Renvoie le dictionnaire ProTutput.
-
Si __name__ == '__MAIN__': Bloc:
- Créez un exemple de dictionnaire CMDTable.
- Appelez RunshowCommands (CMDTable) pour exécuter la commande et obtenir la sortie.
- Boucle dans le dictionnaire de sortie et imprimez la sortie de chaque commande.
Notes:
- Traitement du délai d'expiration: Communiquer (Timeout = 180) définit le temps de temps mort pour empêcher le processus de l'enfant de s'exécuter indéfiniment. Si le processus de l'enfant ne se termine pas dans le délai spécifié, une exception de temps à échéance sera augmentée et le processus sera interrompu.
- Gestion des erreurs: le code contient un essai ... sauf le bloc, utilisé pour attraper des exceptions possibles, telles que l'échec ou le délai de démarrage du processus d'enfant.
- Sécurité des threads: assurez-vous que l'accès et la modification des ressources partagées (comme le dictionnaire ProTutput) dans un environnement multi-thread sont en file d'attente. Dans cet exemple, puisque chaque thread écrit une clé différente, le fonctionnement d'écriture du dictionnaire est en filetage.
- Limites des ressources: la création de trop de threads peut consommer beaucoup de ressources système. La taille du pool de threads doit être ajustée en fonction de la nature des ressources et des tâches du système.
- Sécurité: lors de l'exécution de commandes avec shell = true, vous devez faire attention aux risques d'injection de commande. Assurez-vous que la chaîne de commande provient d'une source de confiance ou échappez à l'entrée de manière appropriée.
- Journalisation: utilisez le module de journalisation pour enregistrer l'état de fonctionnement du programme, ce qui est pratique pour le débogage et le dépannage.
Résumer:
En utilisant des pools de threads, plusieurs processus d'enfants peuvent être exécutés simultanément, améliorant ainsi considérablement l'efficacité d'exécution du programme. La mise en commun des threads est une technique très utile lorsqu'il s'agit d'un grand nombre de tâches simultanées. N'oubliez pas de prendre en compte des facteurs tels que le traitement du délai d'attente, la gestion des erreurs, la sécurité des filetages et les contraintes de ressources pour assurer l'exactitude et la stabilité de votre programme.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Exécutez pipinstall-rrequirements.txt pour installer le package de dépendance. Il est recommandé de créer et d'activer l'environnement virtuel d'abord pour éviter les conflits, s'assurer que le chemin du fichier est correct et que le PIP a été mis à jour et utiliser des options telles que --No-Deps ou --User pour ajuster le comportement d'installation si nécessaire.

Ce tutoriel détaille comment fusionner efficacement l'adaptateur PEFT LORA avec le modèle de base pour générer un modèle complètement indépendant. L'article souligne qu'il est faux d'utiliser directement Transformers.Automodel pour charger l'adaptateur et fusionner manuellement les poids, et fournit le processus correct pour utiliser la méthode Merge_and_unload dans la bibliothèque PEFT. De plus, le tutoriel souligne également l'importance de traiter les segments de mots et discute des problèmes et des solutions de compatibilité des versions de PEFT.

Python est un outil de test simple et puissant dans Python. Après l'installation, les fichiers de test sont automatiquement découverts en fonction des règles de dénomination. Écrivez une fonction commençant par test_ pour les tests d'assurance, utilisez @ pytest.fixture pour créer des données de test réutilisables, vérifiez les exceptions via PyTest.Rais, prend en charge l'exécution de tests spécifiés et plusieurs options de ligne de commande et améliore l'efficacité des tests.

TheargParsemoduleisthereComMendwaytoHandleCommand-lineargumentsInpython, fournissantRobustParsing, Typevalidation, HelpMessages, AnderrorHling; usys.argvforsimplécasesrequiringminimalsepup.

Cet article vise à explorer le problème commun de la précision de calcul insuffisante des nombres de points flottants dans Python et Numpy, et explique que sa cause profonde réside dans la limitation de représentation des nombres de points flottants 64 bits standard. Pour les scénarios informatiques qui nécessitent une précision plus élevée, l'article introduira et comparera les méthodes d'utilisation, les fonctionnalités et les scénarios applicables de bibliothèques mathématiques de haute précision telles que MPMATH, SYMPY et GMPY pour aider les lecteurs à choisir les bons outils pour résoudre les besoins de précision complexe.

PYPDF2, PDFPLUMBER et FPDF sont les bibliothèques de base pour Python pour traiter PDF. Utilisez le PYPDF2 pour effectuer l'extraction de texte, la fusion, la division et le chiffrement, tels que la lecture de la page via Pdfreader et l'appel extract_text () pour obtenir du contenu; PDFPLUMBER convient plus pour conserver l'extraction de texte de mise en page et la reconnaissance de la table, et prend en charge extract_tables () pour capturer avec précision les données de table; FPDF (FPDF2 recommandé) est utilisé pour générer du PDF, et les documents sont construits et sorties via add_page (), set_font () et cellule (). Lors de la fusion des PDF

Importer @ contextManagerfromContextLibandDeFineAgeneratorFonctionnement toTyieldSexactlyOnce, où les actes de championnalsAnterAndCodeLifteryiel

L'obtention de l'heure actuelle peut être implémentée dans Python via le module DateTime. 1. Utilisez dateTime.now () pour obtenir l'heure actuelle locale, 2. Utilisez le strftime ("% y-% m-% d% h:% m:% s") pour formater l'année de sortie, le mois, le jour, l'heure, la minute et la seconde, 3. UTCNow () et les opérations quotidiennes peuvent répondre aux besoins en combinant DateTime.now () avec des chaînes formatées.
