Как глобальные объекты обрабатываются в потоке? - PullRequest
1 голос
/ 11 октября 2011

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

В файле: https://www.megiforge.pl/p/elephantoplasty/source/tree/0.0.1/src/eplasty/ctx.py Вы можете видеть, что существует глобальный объект ctx, который содержит сессию по умолчанию. Что если я запустил set_context () и start_session () в промежуточном программном обеспечении при входе? Могу ли я ожидать, что в каждом потоке будет отдельный сеанс в ctx? Или есть риск, что два потока будут использовать один и тот же сеанс?

1 Ответ

2 голосов
/ 11 октября 2011

Глобальные переменные совместно используются всеми потоками, поэтому, если вы запустите эти функции, потоки будут конфликтовать друг с другом непредсказуемым образом.

Чтобы сделать то, что вы хотите, вы можете использовать локальные данные потока, используя threading.local .Вам нужно удалить глобальное определение ctx и затем создать следующую функцию.

def get_ctx():
    thread_data = threading.local()
    if not hasattr(thread_data, "ctx"):
         thread_data.ctx = Ctx()
    return thread_data.ctx

Затем везде, где вы ссылаетесь на ctx, вызывайте get_ctx().Это гарантирует, что ваш контекст не будет разделен между потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...