Доброго всем.
Пробую на Питоне3 + uwsgi-сервер простое приложение, где естестественно нужно иметь пулл соединений с БД (Postgresql). Причем остановился на драйвере py-postgresql, потому, что в распространенном драйвере Psycopg была ошибка и речь сейчас не о ней. Сразу выяснилось, что драйвер py-postgresql не является threading safe и делаю попытку блокировки при извлечении соединения из пула.
#!/usr/bin/python3
import postgresql
import threading
lock = threading.Lock()
db = []
db.append(postgresql.open("pq://postgres@127.0.0.1/postgres"))
for i in range(10):
db.append(db[0].clone())
class App(object): #threading.local
def run(self, env, start_response):
lock.acquire(1)
self.db = db.pop()
lock.release()
self.st = self.db.prepare('select $1::text')
resp = ['<h1>Работает</h1>'.encode('utf-8'), str(self.st('тест 1')).encode('utf-8')]
lock.acquire(1)
db.insert(0, self.db)
lock.release()
start_response('200 OK', [("Content-type", "text/html; charset=UTF-8"),])
return resp
def application(env, start_response):
return App().run(env, start_response)
Проблема драйвера py-postgresql для treading так и не решилась для числа worker`ов uwsgi больше чем 1 (processes=1 работает).
Поэтому хочу спросить, что еще можно попробовать сделать, чтобы нормально работать в тредах uwsgi с подготовленными соединениями таких драйверов и вообще общих разделяемых данных?
Что-то слышал еще про threading.local для моего класса App(), но тоже не работает.
Пробовал еще pgbouncer, но и тут py-postgresql не хотел соединяться с прокси.
Не ругайте, если в чем-то ошибаюсь, в терминологии.