поведение асинхронной глобальной переменной с внутримодульными глобальными переменными в python - PullRequest
0 голосов
/ 01 июня 2011

Итак, у меня есть модуль глобальных переменных global_var.py, который выглядит так:

x = 1
y = 2

Когда я хочу получить доступ к этим переменным, я могу сделать что-то вроде этого:* Я заметил, что иногда, если я изменяю глобальную переменную и сразу пытаюсь прочитать ее, иногда я получаю старое значение.Например,

import global_var

global_var.x = 'new'
if global_var.x == 'new':
    print 'changed'
else:
    print 'not changed'

Вышеуказанная операция представляется вероятностной благодаря асинхронности.Так что же с этим, есть ли способ сделать подобные вещи детерминированными, или я просто не должен делать это?Все хорошо, спасибо за все время и предложения.

1 Ответ

3 голосов
/ 01 июня 2011

Поведение, которое вы описали, не должно происходить, если вы просто делаете то, что, как вы сказали, делаете. Дважды проверьте свой код, возможно, вы на самом деле не устанавливаете новое значение в определенных случаях, которые, по вашему мнению, вы делаете; или, возможно, вы читаете, прежде чем писать иногда; или, может быть, у вас есть потоки, и точный порядок чтения и записи является недетерминированным. Если ваши глобальные переменные на самом деле находятся в вашем модуле __main__ (то есть в файле .py, который вы выполняете в командной строке), то, возможно, у вас есть две их копии (одна копия создается, когда файл .py превращается в * 1002). * модуль, потому что вы запустили его в командной строке; вторая копия создается, когда другой модуль импортирует его по его имени, создавая новый модуль с дубликатом копии всего вашего кода и данных). В качестве очень маловероятной альтернативы, возможно, память на вашем компьютере выходит из строя и вызывает неправильное, непредсказуемое поведение.

Установка атрибута всегда устанавливает его (или, по крайней мере, вызывает специальный метод, который отвечает за его установку - вы можете переопределить этот специальный метод на , а не установить его по какой-то причине, но тогда это ваша ошибка. :)

Кроме того, использование «глобальных переменных модулей», как это плохо, если вы хотите создавать понятное, поддерживаемое, тестируемое (работающее) программное обеспечение. Это своего рода «жуткое действие на расстоянии». Кто знает, на какие другие части вашей программы вы будете влиять, когда устанавливаете одну из этих переменных. Вместо этого шаблона передайте аргументы каждой функции. Сделайте так, чтобы подпись каждой функции включала все состояния, необходимые для выполнения ее работы. Если у вас много состояний и вам не нравятся длинные подписи аргументов, подумайте о создании объектов для хранения этого состояния и добавлении методов к этим объектам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...