Python: безопасно читать значения из объекта в потоке? - PullRequest
4 голосов
/ 15 сентября 2010

У меня есть программа Python / wxPython, где GUI является основным потоком, и я использую другой поток для загрузки данных из файла. Иногда файлы большие и медленно загружаются, поэтому я использую диалог wxPulse для индикации прогресса.

Когда я загружаю файл, я считаю количество строк, которые были прочитаны в подсчитывающем потоке, и я отображаю это количество в диалоговом окне wxPulse в главном потоке. Я получаю счет в основном потоке, читая ту же переменную, в которую записывается загрузочный поток.

Это "потокобезопасный"? Может ли это как-то вызвать проблемы? Я делал это некоторое время, и пока все было хорошо.

PS. Я знаю, что могу использовать очередь для передачи счета, но я ленивый и не хочу, если мне не нужно.

Ответы [ 5 ]

5 голосов
/ 15 сентября 2010

Как правило, пока ...

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

все хорошо.

2 голосов
/ 15 сентября 2010

В обычном python это будет безопасно, так как весь доступ к переменным защищен GIL (Global Interpreter Lock), это означает, что весь доступ к переменной синхронизирован, поэтому только один поток может сделать это одновременно. Единственная проблема, как заметил @Eloff, если вам нужно прочитать более одного значения и вам нужно, чтобы они были согласованными - в этом случае вам потребуется спроектировать некоторый контроль доступа.

1 голос
/ 15 сентября 2010

Это довольно безопасно.

Когда счет увеличивается от n до n + 1, создается «объект n + 1», а затем счет переключается со ссылки на «объект n» на новый «n».+1 объект ".

Не существует этапа, на котором счетчик ссылается на что-либо, кроме" n объекта "или" n + 1 объекта "

1 голос
/ 15 сентября 2010

Это нормально, потому что у вас есть только один поток писателя. Операции только для чтения всегда потокобезопасны. Исключение из этого возникает, когда вы читаете более одного связанного значения и ожидаете некоторой формы согласованности между ними. Поскольку запись может происходить в любое время, считывание нескольких значений может быть непоследовательным и даже может вообще не иметь никакого разумного состояния программы. В этом случае блокировки используются для того, чтобы множественные чтения выглядели как отдельная атомарная операция, исключающая любые записи.

0 голосов
/ 15 сентября 2010

Это безопасно только потому, что это не особенно критично.Странные вещи, такие как значение, не обновляющееся, когда оно не должно иметь значения.Очень трудно получить точный ответ о том, что происходит, когда вы притворяетесь, что единственное целое, которое читается и записывается, является «атомарным», поскольку это зависит от точной архитектуры и множества других вещей.Но это не сделает ничего хуже, чем иногда давать неправильный номер, так что продолжайте ... или используйте очередь.:)

...