Différents comportements des variables synchronisées dans différents systèmes d'exploitation

Barbara Streisand
Libérer: 2024-11-10 03:13:02
original
444 Les gens l'ont consulté

Synchronized 变量在不同操作系统的不同行为

Référencement :

  • La valeur de la variable synchronisée Python ne change pas dans le contexte global
  • Valeur synchronisée non modifiée dans le processus principal
  • Valeur synchronisée non partagée entre les processus

Dans la bibliothèque multitraitement de Python, il existe multiprocessing.sharedctypes.synchronized, un type de wrapper utilisé pour partager des données entre différents processus. Par défaut, un verrou réentrant RLock est utilisé pour maintenir la cohérence des données. Avant de réapprendre Python cette fois, j'utilisais Python 3.6. Même si j'avais à l'époque utilisé une connaissance superficielle de la bibliothèque mp, je n'avais pas réfléchi en profondeur aux différents comportements des programmes multi-processus sur différents systèmes d'exploitation et à leur impact possible.

En étudiant cette fois, j'ai rencontré un problème : lorsque je crée une variable multiprocessing.sharedctypes.Value dans le contexte global en utilisant Python 3.12 sur le système macOS, si j'accède à cette variable dans un nouveau processus, sa valeur de synchronisation n'est pas maintenu entre les différents processus. Après avoir discuté avec le professeur Eric Greene, j'ai découvert que depuis Python 3.8, la manière de créer de nouveaux processus dans différents systèmes d'exploitation a changé :

  • Les systèmes Linux utilisent toujours fork pour créer de nouveaux processus. Pendant fork, toutes les ressources du processus parent sont héritées par le processus enfant, donc les variables de synchronisation définies globalement dans le processus parent sont également accessibles par le processus enfant, donc la cohérence des données est conservée
  • Les systèmes Windows utilisent toujours spawn, qui est une méthode de création d'un nouveau processus interpréteur Python pour implémenter le multi-traitement. Cela équivaut à « ouvrir davantage » de Python, il y a donc plus de frais généraux et une efficacité moindre, mais il s'agit d'une limitation du système Windows lui-même. Dans ce cas, le processus enfant hérite uniquement des ressources requises par la méthode run() du processus parent pour démarrer le nouveau processus.
  • Le système macOS utilisait fork avant Python 3.8, puis a changé pour spawn, donc certains comportements multi-processus ont changé. (macOS peut toujours être configuré pour utiliser fork, mais Python n'est pas officiellement recommandé)

Dans mon exemple, comme la variable Synchronisée est déclarée globalement dans le processus parent, elle ne sera pas héritée par le processus enfant sur les systèmes Windows et macOS, donc les valeurs​​sont différentes entre les différents processus sur les systèmes Linux ; , toutes les ressources du processus parent sont héritées, le processus enfant peut donc modifier sa valeur.

Cela a provoqué le phénomène que j'ai observé : les variables de synchronisation globales de mon code sur macOS n'ont pas changé ; alors que les systèmes Linux d'autres personnes fonctionnaient normalement et les variables étaient synchronisées entre tous les processus.

Lecture de référence :

  • https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods
  • https://docs.python.org/3/library/multiprocessing.html#multiprocessing.sharedctypes.synchronized

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!

source:dev.to
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal