Статические методы и безопасность резьбы - PullRequest
3 голосов
/ 12 июля 2009

В python со всей этой идеей «Все является объектом», где потокобезопасность?

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

Ответы [ 2 ]

8 голосов
/ 12 июля 2009

Функции в модуле эквивалентны статическим методам в классе. Проблема безопасности потоков возникает, когда несколько потоков могут изменять общие данные или даже один поток может изменять такие данные, в то время как другие читают их; Лучше всего этого избежать, если данные принадлежат ОДНОМУ модулю (доступ к которому осуществляется через Queue.Queue от других), но когда это невозможно, вам приходится прибегать к блокировке и другим, более сложным примитивам синхронизации.

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

Если вы используете модуль multiprocessing в стандартной библиотеке Python вместо модуля threading, на самом деле вам, возможно, не придется заботиться о «безопасности потоков» - в основном потому, что НИКАКИЕ данные не распределяются между процессами ... ну, если вы не выходите из своего пути, чтобы изменить это, например, через mmap ped файлы; -).

0 голосов
/ 12 июля 2009

См. документацию по Python , чтобы лучше понять общие последствия Python для безопасности потоков.

Похоже, что сам Django является поточно-безопасным по состоянию на 1.0.3, но ваш код может быть нет, и вам придется проверить, что ...

Мой совет - просто не заботиться об этом и обслуживать ваше приложение несколькими процессами вместо нескольких потоков (например, используя apache 'prefork' вместо 'worker' MPM).

...