Что так плохо с threadlocals

Все в мире Django, кажется, ненавидят threadlocals ( http://code.djangoproject.com/ticket/4280 , http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser ). Я прочитал эссе Армина об этом ( http://lucumr.pocoo.org/2006/7/10/why-i-cant-stand-threadlocal-and-others ), но большая часть его зависит от threadlocals, потому что это безвкусный.

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

Также много фреймворков Java, похоже, многократно используют threadlocals, так как их отличие от Python / Django?

    5 Solutions collect form web for “Что так плохо с threadlocals”

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

    Поэтому я говорю: используйте подходящий инструмент для работы, в этом случае threadlocals делают ваше приложение намного более элегантным, чем прохождение модели поддомена во всех модельных методах (не говоря уже о том, что это даже не всегда возможно – когда вы переопределяете django менеджер методов для ограничения запросов по субдомену, у вас нет возможности передать что-либо дополнительно в get_query_set, например, так что threadlocals – это естественный и единственный ответ).

    Я избегаю такого рода использования threadlocals, потому что он вводит неявное нелокальное соединение. Я часто использую модели во всех видах не-HTTP-ориентированных способов (локальные команды управления, импорт / экспорт данных и т. Д.). Если я получаю доступ к некоторым данным threadlocals в models.py, теперь я должен найти способ убедиться, что он всегда заполняется всякий раз, когда я использую свои модели, и это может стать довольно уродливым.

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

    Если бы я абсолютно не мог найти способ хранения данных запроса в threadlocals, я бы, по крайней мере, реализовал методы обертки в отдельном модуле, которые обращаются к threadlocals и вызывают методы модели с необходимыми данными. Таким образом, models.py остается автономным, и модели могут использоваться без муфты threadlocals.

    Также много фреймворков Java, похоже, многократно используют threadlocals, так как их отличие от Python / Django?

    Интерпретатор CPython имеет глобальную блокировку интерпретатора (GIL), что означает, что интерпретатор может выполнять только один поток Python в любой момент времени. Мне не ясно, что для реализации интерпретатора Python обязательно потребуется использовать более одного потока операционной системы, хотя на практике это делает CPython.

    Основной механизм блокировки Java – через блокировки объектов. Это децентрализованный подход, который позволяет использовать несколько параллельных потоков на многоядерных и многопроцессорных процессорах, но также создает гораздо более сложные проблемы синхронизации для программиста.

    Эти проблемы синхронизации возникают только в режиме «shared-mutable state». Если состояние не изменено, или, как в случае с ThreadLocal, оно не является общим, то это одна менее сложная проблема для программиста Java.

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

    Программист CPython также имеет возможность кодировать критически важный код кода в Cython-коде Cython или C ++, где ограничение GIL не применяется. Технически Java-программист имеет аналогичный вариант через JNI, но это правильно или неправильно считается менее приемлемым в Java, чем в Python.

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

    Почему передача его из запроса не стоит? Почему вы не храните его в сеансе или в профиле пользователя?

    Разница с Java заключается в том, что в веб-разработке гораздо больше состояний, чем в Python / PERL / PHP / Ruby, поэтому люди привыкли ко всем типам контекстов и тому подобное. Я не думаю, что это преимущество, но вначале это похоже.

    Я нашел использование ThreadLocal – отличный способ реализовать Injection Dependency в среде HTTP-запроса / ответа (то есть любой webapp). Вы просто настроили фильтр сервлета, чтобы «вставить» нужный объект в поток при получении запроса и «uninject» его при возврате ответа.

    Это умный человек DI без всякого уродства XML, без MB Spring Jars (не говоря уже о его кривой обучения) и без всякой критической повторяющейся номенклатуры @annotation и потому, что она не индивидуально вставляет много экземпляров объектов с зависимостями, это, вероятно, черт быстрее и использует меньше памяти.

    Он работал так хорошо, что мы открыли наш фильтр exPOJO, который может вводить сессию Hibernate или JDO PersistenceManager с помощью ThreadLocal:

    http://www.expojo.com

     
    Interesting Posts for Van-Lav

    Чтение цели .lnk-файла в Python?

    Setuptools не передает аргументы для entry_points

    Когда установлен виртуальный бокс оракула, Как получить локальный IP-адрес в python

    Как использовать OpenCV в python 3.4 для Windows 7 x64?

    Дублирование журнала при использовании модуля протоколирования Python

    Панды: Получите дублированные индексы

    Инструмент Python, который строит диаграмму зависимостей для методов класса

    Как я могу читать из файла, состоящего из имен городов и координат / групп населения и создавать функции для получения координат и населения?

    Есть ли плагин для управления версиями Mercurial или Git для PyScripter?

    Что содержит аудиокадр?

    Преобразование формата unicode в формат datetime в формате strptime

    Подсчитайте строки кода в проекте Django

    Numpy.Array в списке Python?

    Python Индекс структуры данных Начните с 1 вместо 0?

    измерять прогресс (время осталось), в то время как os.listdir генерирует список (Python)

    Python - лучший язык программирования в мире.