Являются ли глобальные переменные Python потокобезопасными?

StackOverflow https://stackoverflow.com/questions/2248434

  •  20-09-2019
  •  | 
  •  

Вопрос

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

я использую 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 довольно просто использовать.Используйте попытку:окончательно:шаблон, чтобы гарантировать, что блокировка будет снята после изменения глобальной переменной.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top