Maison > Article > développement back-end > Développement Python – explication détaillée des processus, des threads et des coroutines
Un programme ne peut pas s'exécuter seul. Ce n'est que lorsque le programme est chargé en mémoire et que le système lui alloue des ressources qu'il peut s'exécuter. Ce programme exécuté est appelé un processus. La différence entre un programme et un processus est qu'un programme est un ensemble d'instructions, qui est un texte de description statique du processus. Un processus est une activité d'exécution du programme et est un concept dynamique.
Thread est la plus petite unité sur laquelle le système d'exploitation peut effectuer la planification des opérations. Il est inclus dans le processus et constitue la véritable unité opérationnelle du processus. Un thread fait référence à un seul flux de contrôle séquentiel dans un processus. Plusieurs threads peuvent s'exécuter simultanément dans un processus et chaque thread exécute différentes tâches en parallèle.
Les threads partagent l'espace mémoire et la mémoire du processus est indépendante.
Les threads d'un même processus peuvent communiquer directement entre eux, mais deux processus doivent communiquer entre eux via un agent intermédiaire.
Créer un nouveau thread est très simple. Créer un nouveau processus nécessite de cloner son processus parent.
Un thread peut contrôler et faire fonctionner d'autres threads dans le même processus, mais un processus ne peut faire fonctionner que des processus enfants.
Peu importe le nombre de threads ouverts et le nombre de processeurs, python n'autorise qu'un seul thread en même temps lors de l'exécution.
设置参数效果如下:
有子线程的结束。如果希望主线程不等待子线程,而是在退出时自动Il s'agit d'un démon (démon). 🎜>
Plusieurs threads peuvent être démarrés sous un seul et plusieurs threads partagent l'espace mémoire du processus parent. Cela signifie que chaque thread peut accéder aux mêmes données. À ce stade, si deux threads souhaitent modifier les mêmes données en même temps, un verrouillage de thread est requis.
Version verrouillée
Le verrouillage empêche les autres threads de partager l'accès aux ressources, et le même thread ne peut acquérir qu'une seule fois. S'il y en a plusieurs, un blocage se produira et le programme ne pourra pas continuer à s'exécuter.
GIL garantit qu'un seul thread peut s'exécuter en même temps. Le verrouillage est un verrouillage au niveau de l'utilisateur et n'a rien à voir avec GIL.
Rlock permet de multiples acquisitions dans un même thread La libération des ressources partagées par un thread nécessite la libération de tous les verrous. Autrement dit, n fois d’acquisition nécessitent n fois de libération.
这两种锁的主要区别是,RLock允许在同一线程中被多次acquire。而Lock Il s'agit d'un système RLock qui permet d'acquérir une version et d'une version n.能真正释放所占用的锁。
互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据,比如售票处有3个窗口,那最多只允许3个人同时买票, 后面 的 人 只 能 等 前面 任意 窗口 的 人 离开 才 能 买 票。。
Timer appelle une fonction à un certain intervalle , si vous souhaitez appeler une fonction de temps en temps, vous devez redéfinir le Timer dans la fonction appelée par le Timer. Timer est une classe dérivée de Thread.
Python fournit l'objet Event pour la communication inter-thread, qui a des paramètres de thread Si l'indicateur de signal est faux, le thread attend que le signal d'instruction soit défini sur vrai par d'autres threads. L'objet Event implémente un mécanisme de communication de thread simple. Il fournit des signaux de configuration, d'effacement, d'attente, etc. pour réaliser la communication entre les threads.
Utilisez la méthode set() de Event pour définir l'indicateur de signal à l'intérieur de l'objet Event sur true. L'objet Event fournit la méthode isSet() pour déterminer l'état de son indicateur de signal interne. Lorsque la méthode set() de l'objet événement est utilisée, la méthode isSet() renvoie true.
Utilisez la méthode clear() de Event pour effacer l'indicateur de signal à l'intérieur de l'objet Event, c'est-à-dire le définir sur false Lors de l'utilisation de la méthode clear() d'After Event, la méthode isSet() renvoie false.
La méthode wait() de l'événement ne s'exécutera rapidement et terminera le retour que lorsque le signal interne est vrai. Lorsque l'indicateur de signal interne de l'objet Event est faux, la méthode wait() attend qu'il soit vrai avant de revenir.
Utilisez Event pour réaliser l'interaction entre deux ou plusieurs threads. Prenons le feu de signalisation comme exemple, démarrez un fil pour agir comme un feu de circulation, générez plusieurs threads pour agir comme des véhicules, et le. les véhicules s'arrêteront selon la règle rouge et verte.
La file d'attente en Python est la forme la plus couramment utilisée pour échanger des données entre les threads. Le module Queue est un module qui fournit des opérations de file d'attente.
La classe queue.Queue est une implémentation synchrone d'une file d'attente. La longueur de la file d'attente peut être illimitée ou limitée. La longueur de la file d'attente peut être définie via le paramètre facultatif maxsize du constructeur Queue. Si maxsize est inférieur à 1, la longueur de la file d'attente est illimitée.
Appelez la méthode put() de l'objet file d'attente pour insérer un élément à la fin de la file d'attente. put() a deux paramètres : le premier élément est obligatoire et est la valeur de l'élément inséré ; le deuxième bloc est un paramètre facultatif et sa valeur par défaut est 1. Si la file d'attente est actuellement vide et que le bloc vaut 1, la méthode put() provoque la pause du thread appelant jusqu'à ce qu'une unité de données devienne disponible. Si block vaut 0, la méthode put() lèvera une exception Full.
L'appel de la méthode get() de l'objet file d'attente supprime et renvoie un élément de la tête de la file d'attente. Le paramètre facultatif est block, dont la valeur par défaut est True. Si la file d'attente est vide et que block est True, get() provoque la pause du thread appelant jusqu'à ce qu'un élément devienne disponible. Si la file d'attente est vide et que le bloc est False, la file d'attente lèvera une exception vide.
L'utilisation des modèles de producteur et de consommateur dans le développement et la programmation peut résoudre la plupart des problèmes de concurrence. Ce mode améliore la vitesse globale de traitement des données du programme en équilibrant les capacités de travail du thread de production et du thread consommateur.
Dans le monde des threads, le producteur est le fil qui produit des données, et le consommateur est le fil qui consomme des données. Dans le développement multithread, si la vitesse de traitement du producteur est très rapide et celle du consommateur est très lente, alors le producteur doit attendre que le consommateur ait terminé le traitement avant de continuer à produire des données. De la même manière, si la puissance de traitement du consommateur est supérieure à celle du producteur, alors le consommateur doit attendre le producteur. Afin de résoudre ce problème, les modèles producteur et consommateur ont été introduits.
Le modèle producteur-consommateur utilise un conteneur pour résoudre le problème du couplage fort entre producteurs et consommateurs. Les producteurs et les consommateurs ne communiquent pas directement entre eux, mais via des files d'attente de blocage. Par conséquent, une fois que le producteur a produit les données, il n'attend plus que le consommateur les traite, mais les jette directement dans la file d'attente de blocage. demandez des données au producteur, mais prenez-les directement à partir de la file d'attente de blocage. La file d'attente de blocage est équivalente à un tampon, équilibrant les capacités de traitement des producteurs et des consommateurs.
L'exemple le plus basique du modèle producteur-consommateur.
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!