recherche
Maisondéveloppement back-endTutoriel PythonProgrammation serveur Python : comment les démons sont implémentés

Programmation serveur Python : comment les démons sont implémentés

Jun 18, 2023 pm 08:04 PM
python服务器守护进程

Python est un langage de programmation très populaire, particulièrement largement utilisé dans la programmation réseau. La programmation côté serveur en fait également partie. Dans la programmation côté serveur, les processus démons sont un concept courant. Cet article explique comment implémenter des processus démons dans la programmation serveur Python.

Qu'est-ce qu'un processus démon

Dans le processus d'exécution du programme côté serveur, afin de garantir le fonctionnement stable à long terme du programme, nous devons le convertir en processus démon. Un démon est un processus qui s'exécute en continu en arrière-plan. Ce processus n'occupe pas la console ou la session de connexion et peut être automatiquement redémarré pour garantir que le programme s'exécute pendant une longue période.

Dans les systèmes Linux, les processus démons sont généralement implémentés via l'appel système fork(). Le processus d'implémentation spécifique est le suivant :

  1. Appelez fork() pour créer un processus enfant.
  2. Appelez setsid() dans le processus enfant pour créer une nouvelle session.
  3. Appelez à nouveau fork() dans le processus enfant pour empêcher le processus enfant de devenir le processus principal de la session terminale.
  4. Fermez tous les descripteurs de fichiers.
  5. Redirigez l'entrée, la sortie et la sortie d'erreur standard vers /dev/null.

En Python, nous pouvons créer un processus démon en remplaçant la fonction run() du processus parent. L'implémentation spécifique est la suivante :

import os
import sys

class Daemon:
    def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
        self.stdin = stdin
        self.stdout = stdout
        self.stderr = stderr
        self.pidfile = pidfile

    def daemonize(self):
        if os.path.exists(self.pidfile):
            raise RuntimeError('PID file %s already exists' % self.pidfile)

        # First fork (detaches from parent)
        try:
            if os.fork() > 0:
                sys.exit(0)
        except OSError as e:
            raise RuntimeError('fork #1 failed: %d (%s)' % (e.errno, e.strerror))

        os.chdir('/')
        os.umask(0)
        os.setsid()

        # Second fork (relinquish session leadership)
        try:
            if os.fork() > 0:
                sys.exit(0)
        except OSError as e:
            raise RuntimeError('fork #2 failed: %d (%s)' % (e.errno, e.strerror))

        # Flush I/O buffers
        sys.stdout.flush()
        sys.stderr.flush()

        # Redirect standard file descriptors
        with open(self.stdin, 'rb', 0) as f:
            os.dup2(f.fileno(), sys.stdin.fileno())
        with open(self.stdout, 'ab', 0) as f:
            os.dup2(f.fileno(), sys.stdout.fileno())
        with open(self.stderr, 'ab', 0) as f:
            os.dup2(f.fileno(), sys.stderr.fileno())

        # Write pidfile
        with open(self.pidfile, 'w') as f:
            print(os.getpid(), file=f)

    def start(self):
        self.daemonize()
        self.run()

    def stop(self):
        if os.path.exists(self.pidfile):
            with open(self.pidfile) as f:
                os.kill(int(f.read()), signal.SIGTERM)
            os.remove(self.pidfile)

    def restart(self):
        self.stop()
        self.start()

    def run(self):
        raise NotImplementedError

Dans le code ci-dessus, nous créons un processus démon Python en implémentant une classe nommée Daemon. Parmi eux, la méthode self.daemonize() implémente le processus de création du processus démon, la méthode self.start() démarre le processus démon, la méthode self.stop() arrête le processus démon, la méthode self.restart() redémarre le processus démon et self. La méthode run() doit être réécrite en fonction de la situation réelle.

Lorsque vous utilisez Python pour implémenter un processus démon, vous devez faire attention aux problèmes suivants :

  1. Les descripteurs de fichiers du processus parent et du processus enfant sont indépendants les uns des autres, et il peut y avoir un échec d'ouverture du processus déposer. Pour éviter que cela ne se produise, vous devez utiliser des chemins absolus pour les fichiers que vous souhaitez ouvrir.
  2. Le flux de fichiers n'est pas accessible via sys.stdout et sys.stderr dans le processus démon. Par conséquent, ces flux de fichiers doivent être redirigés vers des fichiers pour faciliter la visualisation des journaux.
  3. Assurez-vous de faire attention au traitement du signal dans le processus démon, car le processus démon s'exécute pendant une longue période et peut mourir en raison de fuites de mémoire et d'autres problèmes. Il doit être redémarré à temps lorsque des conditions anormales se produisent.
  4. Les opérations liées au terminal ne peuvent pas être effectuées dans le processus démon, telles que l'obtention de la largeur et de la hauteur du terminal.

Résumé

Cet article présente comment implémenter des processus démons dans la programmation serveur Python. La création d'un démon Python est relativement simple, mais sa stabilité et sa gestion des erreurs nécessitent plus d'attention. Grâce à l'introduction de cet article, les lecteurs peuvent apprendre à utiliser Python pour créer un processus démon stable et fiable afin de garantir le fonctionnement stable à long terme des programmes côté serveur Python.

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!

Déclaration
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
Quels types de données peuvent être stockés dans un tableau Python?Quels types de données peuvent être stockés dans un tableau Python?Apr 27, 2025 am 12:11 AM

PythonlistScanstoreanyDatatype, ArrayModulearRaySstoreOneType, et NumpyArraysArnumericalComptations.1) ListesaSaSatilebutlessmemory-Efficient.2) NumpyArraySareMory-EfficientForHomoGeneousData.3)

Que se passe-t-il si vous essayez de stocker une valeur du mauvais type de données dans un tableau Python?Que se passe-t-il si vous essayez de stocker une valeur du mauvais type de données dans un tableau Python?Apr 27, 2025 am 12:10 AM

Lorsque vous vous assumez de la valeur de la valeur de la datyypie de la datyylethonarray.

Quelle partie fait partie de la bibliothèque standard Python: listes ou tableaux?Quelle partie fait partie de la bibliothèque standard Python: listes ou tableaux?Apr 27, 2025 am 12:03 AM

PythonlistSaReparmentofthestandardLibrary, tandis que les coloccules de colocède, tandis que les colocculations pour la base de la Parlementaire, des coloments de forage polyvalent, tandis que la fonctionnalité de la fonctionnalité nettement adressée.

Que devez-vous vérifier si le script s'exécute avec la mauvaise version Python?Que devez-vous vérifier si le script s'exécute avec la mauvaise version Python?Apr 27, 2025 am 12:01 AM

TheScriptSrunning withthewrongpythonversionDuetOincorrectDefaultInterpretersettings.tofixThis: 1) vérifiez laefaultpythonversionusingpython - Versionorpython3 - Version.2)

Quelles sont les opérations communes qui peuvent être effectuées sur des tableaux Python?Quelles sont les opérations communes qui peuvent être effectuées sur des tableaux Python?Apr 26, 2025 am 12:22 AM

PythonarRaySSupportVariousOperations: 1) SpecingExtractsSubSets, 2) A SPENDANT / EXPENSEDADDDSELLESS, 3) INSERtingPlaceSelelementsAtSpecific Positions, 4) RemovingdeleteSelements, 5) Sorting / ReversingChangeSes

Dans quels types d'applications les tableaux Numpy sont-ils couramment utilisés?Dans quels types d'applications les tableaux Numpy sont-ils couramment utilisés?Apr 26, 2025 am 12:13 AM

NumpyArraysAressentialFor Applications est en train de réaliser des objets de manière numérique et une datamanipulation.

Quand choisiriez-vous d'utiliser un tableau sur une liste dans Python?Quand choisiriez-vous d'utiliser un tableau sur une liste dans Python?Apr 26, 2025 am 12:12 AM

Useanarray.arrayoveralistinpythonwendealing withhomogeneousdata, performance-criticalcode, orinterfacingwithccode.1) homogeneousdata: ArraySaveMemorywithTypelements.2) performance-criticalcode

Toutes les opérations de liste sont-elles prises en charge par des tableaux, et vice versa? Pourquoi ou pourquoi pas?Toutes les opérations de liste sont-elles prises en charge par des tableaux, et vice versa? Pourquoi ou pourquoi pas?Apr 26, 2025 am 12:05 AM

Non, NotallListOperationsResaSupportedByArrays, andviceVersa.1) ArraysDonotsUpportDynamicOperationsLIKEAPENDORINSERSERTWithoutresizing, qui oblige la performance.2) Listes de la glate-enconteConStanttimecomplexityfordirectAccessLikEArraysDo.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

Version crackée d'EditPlus en chinois

Version crackée d'EditPlus en chinois

Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

SublimeText3 version anglaise

SublimeText3 version anglaise

Recommandé : version Win, prend en charge les invites de code !