Являются ли глобальные переменные Python поточно-ориентированными? - PullRequest
5 голосов
/ 12 февраля 2010

edit: я спрашиваю, безопасны ли глобальные переменные в однопоточном веб-фреймворке, таком как tornado

я использую mongoengine orm, который получает соединение с базой данных из глобальной переменной:

_get_db() # gets the db connection

Я также использую Tornado, однопоточный веб-фреймворк Python. в одном конкретном представлении мне нужно получить соединение с базой данных и разыменовать объект DBRef [аналогично внешнему ключу]:

# dereference a DBRef
_get_db().dereference(some_db_ref)

, поскольку соединение, возвращаемое _get_db, является глобальной переменной, существует ли вероятность конфликта и неправильного значения, возвращаемого в неправильный поток?

Ответы [ 4 ]

3 голосов
/ 12 февраля 2010

Потоки всегда должны содержать GIL при взаимодействии с объектами Python. Пространство имен, содержащее переменные, является объектом Python (или frameobject или dict, в зависимости от того, какая это переменная.) Всегда безопасно получить или установить переменные в нескольких потоках. Вы никогда не получите данные мусора.

Однако обычные условия гонки применяются в отношении того, какой объект вы получаете, или какой объект вы заменяете при назначении. Оператор наподобие x += 1 является не поточно-безопасным, поскольку между get и store может выполняться другой поток, изменяя значение x, которое вы затем перезаписываете.

2 голосов
/ 12 февраля 2010

Если предположить, что MongoEngine упаковывает PyMongo (и я верю, что это так), то все будет хорошо. PyMongo полностью поточно-ориентирован.

1 голос
/ 18 апреля 2011

Нет, но блокировки довольно просты в использовании в python. Используйте шаблон try: finally: чтобы убедиться, что блокировка снята после изменения вашей глобальной переменной.

0 голосов
/ 12 февраля 2010

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

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

...