Pythonic потокобезопасный объект - PullRequest
3 голосов
/ 06 сентября 2011

После прочтения этой темы и обсуждения в IRC, ответ выглядит следующим образом: держитесь подальше от тем . Извините за повторение этого вопроса, я намерен углубиться в тему, не принимая ответ «нить зла», с надеждой найти общее решение.

РЕДАКТИРОВАТЬ: Просто скажите "Нет" объединенному злу блокировок, взаимоблокировок, гранулярности блокировок, живых блокировок, недетерминированности и условий гонки. - Гидо ван Россум

Я занимаюсь разработкой веб-приложения на Python, и я хотел бы создать глобальный объект для каждого пользователя, который доступен только текущему пользователю . (например, запрошенный URI)

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

Я вижу, что многие популярные фреймворки (Django, CherryPy, Flask) используют поточные блокировки Python для решения этой проблемы. Если все эти фреймворки идут вразрез с Pythonic и чувствуют необходимость создать глобально доступный объект, это означает, что сообществу нужны такие вещи. И я тоже.

Является ли "лучший" способ передавать объекты вокруг? Является ли единственным альтернативным решением использовать «злые» потоки? Будет ли Pythonic хранить эту информацию в базе данных или в memcached?

Заранее спасибо!

1 Ответ

5 голосов
/ 06 сентября 2011

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

Я также не согласен с тем, что передача объектов вокруг затрудняет обслуживание приложения - обычно это наоборот - глобальное состояние скрывает зависимости в дополнение к необходимости тщательной синхронизации.

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

...