Variable partagée en python multitraitement
Première question est de savoir quelle est la différence entre la Valeur et le Gestionnaire().De la valeur?
Deuxième, est-il possible de partager variable de type entier sans l'aide de la Valeur?
Ci-dessous mon code d'exemple. Ce que je veux est d'obtenir un dict avec une valeur de type entier, et non pas de la Valeur. Ce que j'ai fait est juste le changer tous après le processus. Est-il un moyen plus facile?
from multiprocessing import Process, Manager
def f(n):
n.value += 1
if __name__ == '__main__':
d = {}
p = []
for i in range(5):
d[i] = Manager().Value('i',0)
p.append(Process(target=f, args=(d[i],)))
p[i].start()
for q in p:
q.join()
for i in d:
d[i] = d[i].value
print d
- Pertinentes: eli.thegreenplace.net/2012/01/04/...
Vous devez vous connecter pour publier un commentaire.
Lorsque vous utilisez
Value
vous obtenez unctypes
objet dans la mémoire partagée, qui par défaut est synchronisé à l'aide d'RLock
. Lorsque vous utilisezManager
vous obtenez unSynManager
objet qui contrôle un processus serveur qui permet à des valeurs de l'objet à être manipulés par d'autres processus. Vous pouvez créer plusieurs mandataires en utilisant le même gestionnaire; il n'est pas nécessaire de créer un nouveau manager dans la boucle:La
Manager
peut être partagée entre plusieurs ordinateurs, tandis que lesValue
est limitée à un seul ordinateur.Value
sera plus rapide (exécuter le code ci-dessous pour voir), donc je pense que vous devriez l'utiliser, sauf si vous avez besoin de soutien arbitraire d'objets ou d'accès sur un réseau.Pour résumer:
Manager
de créer plusieurs objets partagés, y compris les dicts etles listes. Utilisation
Manager
partager des données entre ordinateurs sur un réseau.Value
ouArray
quand il n'est pas nécessaire de partager l'informationà travers un réseau et le type de
ctypes
sont suffisantes pour votrebesoins.
Value
est plus rapide queManager
.Avertissement
Par le moyen de partager des données à travers des processus/threads doit être évitée si possible. Le code ci-dessus va probablement fonctionner comme prévu, mais l'augmentation du temps nécessaire à l'exécution
foo
et les choses vont devenir bizarre. Comparer ci-dessus avec:Vous aurez besoin d'un
Lock
pour faire ce travail correctement.Je ne suis pas particulièrement bien informé au sujet de tout cela, alors peut-être que quelqu'un d'autre va venir et d'offrir plus de perspicacité. J'ai pensé que je voudrais apportent une réponse car la question n'était pas attirer l'attention. Espérons que cela vous aide un peu.
Array
vous donnera un partagées ctypes tableau. Vous devez décider quel type de données que vous stockez à l'avance, et de fournir une type de code. Par exemple,a = Array('c', 10)
crée un tableau de chaînes de caractères de longueur 10. De nouvelles entrées peuvent être ajoutées au tableau comme suit:a[0] = 'b'
. Vous ne pouvez pas ajouter aucun la valeur d'un tableau, voir la liste des codes de type.multiprocessing.Array
est la mémoire allouée à la création et à la différence dearray.array
ne peut pas être élargi. Utilisationmanager.list
si vous n'avez vraiment aucune idée de combien d'espace vous avez besoin, mais vous pouvez essayer avec de l'allocation d'unArray
avec un peu d'espace supplémentaire si vous pouvez trouver une limite supérieure sur la taille. J'espère que ça aide.Lock
pour protégerValue
, voir eli.thegreenplace.net/2012/01/04/...