LINUX.ORG.RU

как лучше организовать работу python3 с sqlite из потоков?


0

1

на данный момент ситуация такая:
- главный поток подключается к sqlite3 и использует 1 файл базы.
- запускается Н потоков, они все подключаются к этому же sqlite-файлу и вносят в него изменения

сначала пробовал один раз подключиться к базе, а потом юзать соединение из потоков
sqlite запрещает - пишет что нельзя использовать базу, подключенную в другом потоке

потом стал создавать новые подключения в каждом потоке
начал глючить, типа база залочена
решилось использованием Lock()

теперь проблема в том, что когда потоков много - лезет ошибка «unable to open database file»

попробовал сделать очередь Queue, так чтобы потоки кидали в неё задания на изменение базы, а главный поток эти задания обрабатывал и сам работал с базой

и вот в чем проблема: делать всякие insert, update удобно, но как получать данные из базы в потоки?

например в базе есть таблица tasks и 100 потоков берут из таблицы рандом-строки, выполняют их и помечают в базе как выполненные

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


т.е получается, для того чтобы брать из базы рандом строки потоками - все же требуется в каждом потоке создавать подключение к файлу базы
что нам дает «unable to open database file» если потоков много

можете предложить иной способ работы с бд?

Вам надо добиться того, чтобы несколько потоков могли одновременно читать и писать из/в sqlite самостоятельно, т.к. эта библиотека обеспечивает параллельное выполнение запросов чтения, ну и Вам не придётся огород городить.

Sorcerer ★★★★★
()
Ответ на: комментарий от anonymous

Как раз читатель. Причем достаточно злопамятный. У него over 400 потоков создается, а для чего, внятного ответа ТС так и не дал.

baverman ★★★
()
Ответ на: комментарий от baverman

Я наблюдал ТС на других форумах, и знаю, что он занимается написанием спамилок. Так вот, потоки это единственное средство, которое могут осилить спамилкописатели для параллельной работы с хттп. Ну и понятно, 400 потоков нужны для 400 параллельных запросов.

PoMbl4
()
Ответ на: комментарий от PoMbl4

О! Это многое объясняет.

Поэтому, самое простое решение, взять какой-нибудь асинхронный ioloop, gevent например. Тогда отпадает вся мудохня с потоками. Если в одно рыло канал выесть не получиться, то запускаем несколько процессов.

baverman ★★★
()
Ответ на: комментарий от PoMbl4

если ты так резко отзываешься о «спамилкописателях», то наверняка знаешь кучу других, более эффективных способов организовать параллельную работу множества сложных веб-сессий с разными наборами данных. Поделись хоть одним, хоть в приват - век тебе благодарен буду!

sergey-novikov ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.