2010-02-11 5 views
4

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

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

_get_db() # gets the db connection 

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

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

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

+0

Появляется, что это связано скорее с конкретной библиотекой, чем с глобальными переменными. – 2010-02-11 23:03:54

+0

Сделайте mongodb указать, является ли _get_db потокобезопасным? – Skurmedel

ответ

2

Предполагая, что MongoEngine обертывает PyMongo (и я считаю, что это так), тогда вы должны быть в порядке. PyMongo полностью потокобезопасен.

+0

Да, он обертывает pymongo, но хранит экземпляр pymongo.Connection в глобальной переменной – Carson

+0

. Тогда все в порядке - можно разделить экземпляр Connection. – mdirolf

3

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

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

+0

вы говорите, что любая функция или метод класса с 'x + = 1' не являются потокобезопасными? – Carson

+0

Он говорит, что установка глобальных переменных в поточном python может завершиться неудачно - другой поток может сразу установить переменную на другое значение. Если вы полагаетесь на значение, заданное во время блока кода, вы должны использовать блокировки. Это потокобезопасно, поскольку вы не получите seg-faults, но не в том смысле, что можете получить неожиданные значения. Цикл на списках и диктофонах - это классические примеры, где вы можете столкнуться с проблемой - например, клавиша dict может неожиданно исчезнуть. – drevicko

0

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

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

1

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

Смежные вопросы