2010-12-05 10 views
0

J'essaie d'obtenir la variable globale storage_i suivante pour être accessible à la fonction lvl1, j'ai pu la passer à d'autres fonctions à l'intérieur de la classe birdofprey mais je peux pas en dehors de ce cadre. J'ai regardé autour de l'utilisation de variables globales entre les fonctions, etc, et j'ai également vu l'utilisation globale var découragé. Mais, fondamentalement, j'essaye d'avoir la valeur de storage_i résumée de tous les threads. Donc, si cela pouvait se faire sans une variable globale, ce serait aussi génial. Toute aide serait appréciée.Python Global Variable: partage entre classe de fonction puis fonction

Le code: https://github.com/eWizardII/homobabel/blob/master/Experimental/demo_async_falcon.py

Répondre

1

Remplacer ceci:

global storage_i 
storage_i = i 

Avec ceci:

birdofprey.storage_i = i 

Vous avez également une faute de frappe à la ligne 75:

storage_ii = stroage_i + storage_ii 

(stroage_i était destiné à être storage_i)

Cette ligne devrait en fait être:

storage_ii = birdofprey.storage_i + storage_ii 

EDIT: Aussi, sans avoir examiné de près, votre utilisation d'un attribut de classe (storage_i) ressemble il est sensible aux conditions course. Envisagez d'utiliser des mutex pour protéger les accès à cet attribut. Je pense que vous devez également attendre que les threads aient fini de s'exécuter avant de pouvoir accéder aux valeurs.

Mais je ne suis pas sûr si un attribut global (ou class) est vraiment ce que vous voulez. Je pense que ce que vous voulez vraiment, c'est une variable thread locale que vous pouvez accéder une fois le thread terminé (voir la méthode Thread.join). Si je lis cela correctement, alors oubliez ce que j'ai écrit ci-dessus sur les mutex. Au lieu de cela, définissez l'attribut storage_i comme self.storage_i (en créant une instance distincte pour chaque thread). Ensuite, dans la boucle for où vous additionnez les valeurs, accédez à la valeur urlv.storage_i. Encore une fois, il semble qu'il est important que vous effectuez un join sur chaque thread avant d'essayer d'accéder à ses valeurs.

C'est toute l'aide que je peux offrir pour l'instant; peut-être demain matin (mon temps) je peux vérifier encore.

+0

Merci, je l'ai mis en place cependant je pense que urlv.storage_i ne fonctionne pas, actuellement j'ai essayé urlv.self, etc, toujours à la recherche de quoi d'autre pourrait le réparer car il prétend que AttributeError: objet 'birdofprey' n'a aucun attribut 'storage_i 'Code: https://github.com/eWizardII/homobabel/blob/master/Experimental/demo_async_falcon.py (vous pouvez ignorer que ça dit urlvself atm je testais juste des choses différentes) – eWizardII

+0

Le problème semble être que je peux accéder variables qui sont sous la fonction exécuter, mais je peux accéder à ceux de la classe birdofprey. – eWizardII

+0

Bon, alors j'ai réussi à le faire fonctionner, j'avais besoin d'utiliser le verrouillage sur les threads, mais je vais essayer plus tard sans verrouiller, mais pour l'instant cela fonctionne de cette façon. Merci. Code: https://github.com/eWizardII/homobabel/blob/master/Experimental/demo_async_falcon.py – eWizardII

0

Si vous souhaitez accéder storage_i sous lvl1() puis utilisez:

birdofprey.storage_i

Eh bien storage_i n'est pas une variable globale, est un attribut de classe.

+0

Ok merci, mais comment puis-je y accéder quand il est défini sur i sous def run (self):? – eWizardII

+0

n'utilisez pas 'global storage_i', vous devez y accéder en utilisant' self.storage_i' –

+0

Ok, quand je le mets à simplement stocker @storage_i = i @ dans la fonction et y accéder sous @ lvl1() @ @storage_ii = birdofprey.self.storage_i + storage_ii @ affirme que - l'objet type 'birdofprey' n'a pas d'attribut 'self' Code: https://github.com/eWizardII/homobabel/blob/master/Experimental/demo_async_falcon.py – eWizardII

Questions connexes