Являются ли глобальные переменные Python потокобезопасными?
Вопрос
редактировать:я спрашиваю, безопасны ли глобальные переменные в однопоточной веб-инфраструктуре, такой как торнадо
я использую mongoengine orm, который получает соединение с базой данных из глобальной переменной:
_get_db() # gets the db connection
Я также использую Tornado, однопоточную веб-инфраструктуру Python.в одном конкретном представлении мне нужно захватить соединение с базой данных и разыменовать DBRef
объект [похожий на внешний ключ]:
# dereference a DBRef
_get_db().dereference(some_db_ref)
поскольку соединение, возвращаемое _get_db
это глобальная переменная, существует ли вероятность коллизии и возврата неправильного значения не в тот поток?
Решение
Если предположить, что MongoEngine является оберткой PyMongo (и я считаю, что это так), то все будет в порядке.PyMongo полностью потокобезопасен.
Другие советы
Потоки всегда должны хранить GIL при взаимодействии с объектами Python.Пространство имен, содержащее переменные, представляет собой объект Python (либо фрейм-объект, либо dict, в зависимости от типа переменной). Всегда безопасно получать или устанавливать переменные в нескольких потоках.Вы никогда не получите мусорные данные.
Однако обычные условия гонки применяются в отношении того, какой объект вы получаете или какой объект вы заменяете при назначении.Заявление типа x += 1
является нет потокобезопасен, поскольку между получением и сохранением может выполняться другой поток, изменяя значение x
, который вы затем перезапишете.
Нет, но блокировки в Python довольно просто использовать.Используйте попытку:окончательно:шаблон, чтобы гарантировать, что блокировка будет снята после изменения глобальной переменной.
В глобальных переменных нет ничего, что делало бы их более или менее потокобезопасными, чем любые другие переменные.Независимо от того, может ли операция завершиться неудачно или вернуть неверные результаты при выполнении в разных потоках, рекомендуется защитить данные, разделяемые между потоками.
Если я правильно вас понял, вы спрашиваете, безопасна ли переменная в однопоточной среде.В этом случае, когда данные нет разделена между параллельными процессами, переменная безопасна (в конце концов, нет ничего другого, что могло бы ее прервать).