Maison > Article > développement back-end > Comment utiliser le multitraitement pour implémenter la communication inter-processus en Python ?
L'efficacité du code multithread de Python est limitée par GIL et ne peut pas être accélérée par les processeurs multicœurs. Cependant, la méthode multi-processus peut contourner GIL et en tirer parti. d'accélération multi-CPU Améliore considérablement les performances du programme
, mais la communication inter-processus est un problème qui doit être pris en compte. Un processus est différent d'un thread. Un processus possède son propre espace mémoire indépendant et ne peut pas utiliser de variables globales pour transférer des données entre processus.
Dans les exigences réelles du projet, il y a souvent des tâches informatiques intensives ou en temps réel. Parfois, une grande quantité de données, telles que des images, des objets volumineux, etc., doivent être transférées entre les processus. via la sérialisation des fichiers ou l'interface réseau, il est difficile de répondre aux exigences en temps réel et le package de file d'attente de messages tiers de redis, kaffka, RabbitMQ est utilisé, ce qui complique à nouveau le système.
Le module multitraitement Python lui-même fournit diverses méthodes de communication inter-processus très efficaces telles que le mécanisme de message, le mécanisme de synchronisation et la mémoire partagée. Comprendre et maîtriser l'utilisation de diverses méthodes de communication inter-processus Python, ainsi que les mécanismes de sécurité, peuvent contribuer à améliorer considérablement les performances d'exécution du programme.
2. Introduction aux diverses méthodes de communication entre les processus
La sécurité de la mémoire signifie que plusieurs processus peuvent être en compétition pour la même raison. Des exceptions de variables partagées se produisent en raison d'une destruction accidentelle et d'autres raisons. Les objets Queue, Pipe, Lock et Event fournis par le module Multiprocessing ont tous implémenté des mécanismes de sécurité de communication inter-processus.
Si vous utilisez la mémoire partagée pour communiquer, vous devez suivre et détruire vous-même ces variables de mémoire partagée dans le code, sinon elles risquent d'être brouillées ou de ne pas être détruites normalement. Causer une anomalie du système. Sauf si le développeur est très clair sur les caractéristiques d'utilisation de la mémoire partagée, il n'est pas recommandé d'utiliser cette mémoire partagée directement, mais d'utiliser la mémoire partagée via le gestionnaire Manager.
Multiprocessing fournit la classe Manager du gestionnaire de mémoire, qui peut résoudre uniformément les problèmes de sécurité de la mémoire liés à la communication des processus. Diverses données partagées peuvent être ajoutées au gestionnaire, notamment une liste, un dict, une file d'attente, un verrouillage, un événement, un partage. La mémoire, etc., est suivie et détruite de manière uniforme.
3. Communication du mécanisme de message
parent_conn, child_conn = Pipe(duplex=True/False)
from multiprocessing import Process, Pipe def myfunction(conn): conn.send(['hi!! I am Python']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=myfunction, args=(child_conn,)) p.start() print (parent_conn.recv() ) p.join()
2) Méthode de communication de la file d'attente de messages
(1) File d'attente FIFO, premier entré, premier sorti,
class queue.Queue(maxsize=0)
(2) File d'attente LIFO, dernier entré, premier sorti, en fait une pile
class queue.LifoQueue(maxsize=0)
(3) Avec la file d'attente prioritaire, la valeur d'entrée la plus basse est mise en file d'attente en premier
class queue.PriorityQueue(maxsize=0)Méthode principale de la classe Multiprocessing.Queue :
Description | |
---|---|
renvoie la longueur de la file d'attente | |
file d'attente Si elle est pleine, renvoie True, sinon renvoie False | |
si la file d'attente est vide, renvoie True, sinon renvoie False | |
Écrire des données dans la file d'attente | |
Jeter les données hors de la file d'attente, | |
Pas d'attente pour écrire ou lancer |
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!