Maison > Article > développement back-end > Quand utiliser la programmation multi-processus en python
En programmation concurrente, le multi-threading et le multi-processus sont deux modes souvent utilisés (en plus des coroutines, etc.). En raison des limitations du GIL de CPython (Jython et IronPython n'ont pas de GIL, PyPy essaie de supprimer le GIL), seuls les threads qui ont obtenu le GIL peuvent utiliser le CPU, donc en plus de devoir gérer certaines E/S qui peuvent être bloqué (lecture et écriture de fichiers, accès au réseau, etc. ), personne n'utilisera pratiquement le multi-threading de CPython. Par conséquent, cet article parlera d’une programmation multi-processus Python plus utile.
Remarque : Apprentissage recommandé : Tutoriel vidéo Python)
L'environnement décrit dans ce L'article est CPython sous le système d'exploitation Linux (également applicable à la plupart des systèmes POSIX) peut ne pas être applicable au système d'exploitation Windows ou à d'autres implémentations Python.
Afin d'éviter toute ambiguïté, ce qui suit utilise « processus principal » ou « processus actuel » pour faire référence au processus qui a créé le processus enfant, et n'utilise pas « processus parent » à moins que « le processus parent de xx » soit explicitement spécifié.
Contrairement à la nécessité de transmettre un objet appelable lors d'une programmation multi-thread, lors d'une programmation multi-processus, le processus principal est copié dans le processus enfant et le processus enfant ne peut pas être directement requis pour exécuter un objet appelable. .
Dans les systèmes POSIX, cette opération de copie est complétée par les appels système clone() et fork(), et ce dernier est généralement utilisé.
Si fork() est exécuté avec succès, le PID et 0 du processus enfant seront renvoyés respectivement dans le processus principal et le processus enfant, puis le code d'exécution commencera à être différent. S'il échoue (pas assez de mémoire, PID atteint la limite supérieure, etc.), le processus enfant ne sera pas créé, le processus principal renverra -1 et errno sera défini sur le code d'erreur correspondant.
Dans l'implémentation de CPython, os.fork() est principalement une encapsulation de la fonction fork(). La différence est qu'une OSError est levée en cas d'échec. L'attribut errno de l'exception est le code d'erreur correspondant.
Par conséquent, le code Python multi-processus ressemblera à peu près à ceci :
import os try: pid = os.fork() if pid == 0: # 子进程 # 子进程的代码 else: # 主进程 # 主进程的代码 except OSError: # 主进程处理 fork 失败的代码
Pour plus d'articles techniques liés à Python, veuillez visiter le Tutoriel Python rubrique Étudiez !
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!