Глобальная переменная Python: разделение между классом функции и функцией - PullRequest
0 голосов
/ 05 декабря 2010

Я пытаюсь сделать так, чтобы следующая глобальная переменная storage_i была доступна для функции lvl1, я смог передать ее другим функциям внутри класса birdofprey, но не могу получить ее вне этой среды.Я смотрел вокруг на использование глобальных переменных между функциями и т. Д., И я также видел, что использование глобальных переменных не рекомендуется.Но, в основном, я пытаюсь суммировать значение storage_i из всех потоков.Так что, если бы это можно было сделать без глобальной переменной, это тоже было бы здорово.Любая помощь будет оценена.

Код: https://github.com/eWizardII/homobabel/blob/master/Experimental/demo_async_falcon.py

Ответы [ 2 ]

1 голос
/ 05 декабря 2010

Замените это:

global storage_i
storage_i = i 

На это:

birdofprey.storage_i = i

У вас также есть опечатка в строке 75:

storage_ii = stroage_i + storage_ii

(stroage_i былодолжен быть storage_i)

Эта строка должна быть:

storage_ii =  birdofprey.storage_i + storage_ii

РЕДАКТИРОВАТЬ : Кроме того, не обращая внимания на это, вы используете классАтрибут (storage_i) выглядит так, как будто он подвержен условиям гонки.Подумайте об использовании мьютексов для защиты доступа к этому атрибуту.Я думаю, вам также нужно дождаться окончания выполнения потоков, прежде чем вы сможете получить доступ к значениям.

Но я не уверен, действительно ли вам нужен глобальный (или атрибут класса).Я думаю, что вам действительно нужна локальная переменная потока, к которой вы можете получить доступ после завершения потока (см. Метод Thread.join). Если я правильно читаю, то забудьте про мьютексы, о которых я писал выше.Вместо этого установите атрибут storage_i как self.storage_i (создавая отдельный экземпляр для каждого потока.) Затем в цикле for, где вы суммируете значения, получите доступ к значению как urlv.storage_i.Опять же, похоже, что важно выполнить join для каждого потока, прежде чем пытаться получить доступ к его значениям.

Это все, что я могу предложить на данный момент;возможно, завтра утром (мое время) я смогу снова зарегистрироваться.

0 голосов
/ 05 декабря 2010

Если вы хотите получить доступ к storage_i в lvl1(), используйте:

birdofprey.storage_i

Ну, storage_i не является глобальной переменной, это атрибут класса.

...