Un programme qui crée plusieurs processus qui fonctionnent sur une file d'attente pouvant être jointes Q
et qui peut éventuellement manipuler un dictionnaire global D
pour stocker les résultats. (ainsi chaque processus enfant peut utiliser D
pour stocker son résultat et voir également quels résultats les autres processus enfants produisent)
Si j'imprime le dictionnaire D dans un processus fils, je vois les modifications qui y ont été apportées (ie sur D). Mais après que le processus principal rejoint Q, si j'imprime D, c'est un dict vide!
Je comprends que c'est un problème de synchronisation / verrouillage. Quelqu'un peut-il me dire ce qui se passe ici et comment je peux synchroniser l'accès à D?
Réponses:
Une réponse générale implique l'utilisation d'un
Manager
objet. Adapté de la documentation:Production:
la source
multiprocessing.Manager()
renvoie une instance deSyncManager
, dont le nom le suggère!Manager
mais toujours pas de chance. Pourriez-vous s'il vous plaît jeter un oeil à ma question ici et voir si vous pouvez proposer une solution? Je peux toujours obtenir différents nombres aléatoires si je le fais ànp.random.seed(None)
chaque fois que je génère un nombre aléatoire, mais cela ne me permet pas d'utiliser l'état aléatoire du processus parent, ce qui n'est pas ce que je veux. Toute aide est grandement appréciée.le multitraitement n'est pas comme le threading. Chaque processus enfant recevra une copie de la mémoire du processus principal. Généralement, l'état est partagé via la communication (canaux / sockets), les signaux ou la mémoire partagée.
Le multitraitement rend certaines abstractions disponibles pour votre cas d'utilisation - état partagé qui est traité comme local par l'utilisation de proxies ou de mémoire partagée: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Sections pertinentes:
la source
J'aimerais partager mon propre travail qui est plus rapide que le dict de Manager et qui est plus simple et plus stable que la bibliothèque pyshmht qui utilise des tonnes de mémoire et ne fonctionne pas pour Mac OS. Bien que mon dict ne fonctionne que pour les chaînes simples et est actuellement immuable. J'utilise l'implémentation du sondage linéaire et stocke les paires de clés et de valeurs dans un bloc de mémoire séparé après la table.
Sur mon ordinateur portable, les performances sont les suivantes:
exemple d'utilisation simple:
la source
En plus de @ senderle ici, certains pourraient également se demander comment utiliser la fonctionnalité de
multiprocessing.Pool
.La bonne chose est qu'il existe une
.Pool()
méthode pour l'manager
instance qui imite toute l'API familière du niveau supérieurmultiprocessing
.Production:
Il s'agit d'un exemple légèrement différent où chaque processus enregistre simplement son ID de processus dans l'
DictProxy
objet globald
.la source
Peut-être que tu peux essayer pyshmht , l'extension de table de hachage basée sur la mémoire pour Python.
Remarquer
Ce n'est pas entièrement testé, juste pour votre référence.
Il manque actuellement de mécanismes de verrouillage / sem pour le multitraitement.
la source