Maison  >  Article  >  développement back-end  >  Comment garantir un accès partagé aux données en lecture seule en multitraitement ?

Comment garantir un accès partagé aux données en lecture seule en multitraitement ?

DDD
DDDoriginal
2024-10-25 03:02:02687parcourir

How to Ensure Shared Access to Read-Only Data in Multiprocessing?

Multitraitement : garantir un accès partagé aux données en lecture seule

Dans les scénarios multitraitements, la question du partage de données entre processus se pose souvent. Plus précisément, lorsqu'il s'agit de grandes structures de données en lecture seule, il est souhaitable d'éviter de copier ces données dans chaque processus, ce qui peut prendre du temps et consommer beaucoup de mémoire.

Considérez l'extrait de code suivant :

<code class="python">glbl_array = # a 3 Gb array

def my_func( args, def_param = glbl_array):
    #do stuff on args and def_param

if __name__ == '__main__':
  pool = Pool(processes=4)
  pool.map(my_func, range(1000))</code>

Dans cet exemple, une variable globale glbl_array est définie comme un grand tableau (3 Go). La fonction my_func est conçue pour fonctionner sur glbl_array. Lorsque plusieurs processus sont générés pour une exécution parallèle à l'aide de Pool(processes=4), la question se pose : chaque processus recevra-t-il une copie distincte des données dans glbl_array, ou tous les processus partageront-ils les mêmes données en lecture seule ?

Sous Linux, la sémantique de l'appel système fork, qui sous-tend le multitraitement, permet la sémantique de copie sur écriture. Cela signifie que si glbl_array est en lecture seule, les données ne seront pas physiquement copiées entre les processus sauf si cela est nécessaire.

Cependant, si glbl_array est modifié, les modifications apportées par un processus seront reflétées dans les données accessibles à tous les autres. processus. Pour éviter les écrasements de données indésirables, envisagez d'utiliser des objets immuables, tels que la représentation tostring() de glbl_array, comme paramètre par défaut de la fonction.

Vous pouvez également exploiter les fonctionnalités de mémoire partagée fournies par le module multitraitement Python. pour créer et gérer explicitement des segments de mémoire partagée, garantissant ainsi que les données ne sont pas dupliquées entre les processus.

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