2009-07-12 3 views
3

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

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

ответ

8

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

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

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

0

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

сам Джанго, кажется, thread safe от 1.0.3, но ваш код не может и вам придется убедиться, что ...

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

+1

Вам не обязательно использовать prefork MPM. Вы можете использовать режим демонов mod_wsgi. В этом случае вы все равно можете использовать рабочий MPM, поскольку количество процессов и потоков, используемых режимом daemon mod_wsgi, контролируется отдельно. Использование prefork потребуется только для mod_python или встроенного режима mod_wsgi. –

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