multitraitement.Piscine avec une variable globale

Je suis en utilisant la Piscine de la classe de python multitraitement bibliothèque écrire un programme qui va s'exécuter sur un cluster HPC.

Ici est une abstraction de ce que je suis en train de faire:

def myFunction(x):
    # myObject is a global variable in this case
    return myFunction2(x, myObject)

def myFunction2(x,myObject):
    myObject.modify() # here I am calling some method that changes myObject
    return myObject.f(x)

poolVar = Pool()
argsArray = [ARGS ARRAY GOES HERE]
output = poolVar.map(myFunction, argsArray)

La fonction f(x) est contenu dans un *.donc, fichier, c'est à dire, c'est l'appel d'une fonction C.

Le problème que j'ai est que la valeur de la variable de sortie est différente à chaque fois que je lance mon programme (même si la fonction myObject.f() est une fonction déterministe). (Si j'ai seulement un processus, puis la variable de sortie est le même à chaque fois que je lance le programme.)

J'ai essayé de créer l'objet plutôt que de le stocker en tant que variable globale:

def myFunction(x):
    myObject = createObject()
    return myFunction2(x, myObject)

Cependant, dans mon programme, la création de l'objet est cher, et donc, c'est beaucoup plus facile de créer myObject une fois et ensuite modifier à chaque fois que j'appelle myFunction2(). Donc, je voudrais ne pas avoir à créer l'objet à chaque fois.

Avez-vous des conseils? Je suis très nouveau à la programmation parallèle, donc je pouvais aller au sujet de cette tout faux. J'ai décidé d'utiliser la Piscine de la classe car je voulais commencer par quelque chose de simple. Mais je suis prêt à essayer une meilleure façon de le faire.

  • Pourriez-vous corriger de ce programme qui s'exécute? Déclaration des fonctions après vous essayez de les utiliser ne fonctionne pas en Python (et pourraient être utiles à votre problème)
  • Est myObject.modify() idempotent? C'est, pouvez-vous appeler cela un nombre arbitraire de fois, sans changer ce qu'il fait (comme un reset() fonction)? Si oui, ton code devrait fonctionner. Si non, vous aurez des problèmes, car les différents processus chaque modifier leur propre copie de l'objet, séparément les uns des autres, et ainsi vous pouvez obtenir des valeurs dupliquées à travers des processus.
  • Oui, myObject.modifier() est idempotent.
InformationsquelleAutor Hugh Medal | 2013-09-13