Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 16, 2009 06:42:49

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Выбор веб-сервера, ошибки в thread

alexlp

Скорее всего где-то присваивается значение переменной модуля. Ты думаешь, что это происходит при каждом запросе, но это происходит всего 1 раз.

например, если этот код

alexlp
session = Session.query(User).get('request.GET')
session.save()
определен на уровне модуля, то проблема очевидна.

Приведу пример:
надо написать простую обертку вокруг коннекта к Sqlite, чтобы в контроллере, мидлварях или моделях не плодить новые подключения, а использовать уже открытые:

пишем модуль db:
import sqlite3

_coonnections = {}

def connection(database):
try:
return _connections[database]
except KeyError:
cn = sqlite3.connect(database)
_connections[database] = cn
return cn
теперь в сценарии:
from db import connection

cn = connection('test.db')
Все работает, пока я один.
Но как только появятся другие потоки - программа начнет вылетать с ошибкой
ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 2244 and this is thread id 2236
Почему? потому что Python загружает модуль всего 1 раз. Строка “_coonnections = {}” выполняется всего 1 раз и обьекты соединений, добавленные в словарь, сохраняются и доступны из других потоков, которые Apache создает для обработки запросов.

Думаю твои сессии путаются из-за переменных инициализируемых на уровне модуля.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version