блокировка глобальных переменных под модулем Threading в python - PullRequest
3 голосов
/ 08 марта 2012

Предположим, у меня есть 2 потока и одна глобальная переменная в коде Python с модулем потоков. В этом коде только поток-1 изменяет значение глобальной переменной, тогда как поток-2 только читает значение глобальной переменной и выполняет свою задачу в зависимости от этого значения.

В этой ситуации нужно ли защищать доступ к глобальной переменной с помощью Lock ()? В C мьютекс должен использоваться при таком условии. Однако как насчет питона с GIL? Это все еще так? Требуется ли блокировка ()?

1 Ответ

11 голосов
/ 08 марта 2012

Присвоение значения объекта глобальной переменной является атомарной операцией в Python. Другие потоки не могут прочитать переменную неправильно, читая ее, пока она присваивается. GIL гарантирует это в C-реализации Python, но другие реализации могут и действительно дают такую ​​же гарантию по-разному.

Если глобальная переменная является изменяемым объектом, например списком, и вы изменяете этот объект, это зависит от используемого вами метода. Большинство методов встроенных объектов, таких как списки, являются атомарными.

Я не могу с уверенностью сказать, что вам не нужна блокировка, не зная более подробной информации о назначении этой переменной и о том, как вы ее используете. Почему поток-2 должен изменить свое поведение на основе этого значения, и это нормально, если поток-1 изменяет значение сразу после того, как поток-2 принял решение? Если это не так, возможно, вам все еще нужен замок.

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

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