LINUX.ORG.RU

Посоветуйте thread-safe модуль для работы с MySQL из Python


0

1

MySQLdb - подходит для того, чтобы писать в таблицу из одной нити (в цикле), а из другой (в другом цикле) - брать результаты записи?
Segmentation faults можно не опасаться?
На какую типичную производительность можно рассчитывать? Сотни/тысячи INSERT/SELECT в секунду?

★★★★★
Ответ на: комментарий от vertexua

> В Python бывают сегфолты?

Из .so-модуля, бывает, такое прилетает.

pacify ★★★★★
() автор топика

зачем тебе потоки в питоне? Если так хочется делить нагрузку, то процессы в самый раз и проблем с thread-safe нет.

Да и вообще какая-то странная задача, зачем читать данные из БД которые только что записал?

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

> Да и вообще какая-то странная задача, зачем читать данные из БД которые только что записал?

Ну, в принципе, можно «закачивать» таблицу в память перед началом работы, конечно.
Выгружать обратно, по завершении.
Но заказчик хочет, чтобы промежуточный результат работы программы был виден «онлайн», в базе MySQL.

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

Загрузил кусок данных в ПО, выгрузил в БД и его же продолжил обрабатывать. Можно даже усложнить процесс: загрузил кусок в ПО, отправил его через пайп/сокет/zmq/очереди в дочерний пишущий в БД процесс, а в основном процессе продолжил его обрабатывать.

mashina ★★★★★
()

>MySQLdb - подходит для того, чтобы писать в таблицу из одной нити (в цикле), а из другой (в другом цикле) - брать результаты записи?

По идее connection стоит использовать только в одном потоке. Так что лучше заведи pool, бери по соединению на тред и вперёд.

Алсо, multiprocessing в питоне получше, чем threading, и если его ограничения тебе не мешают, то бери его.

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

> Алсо, multiprocessing в питоне получше, чем threading, и если его ограничения тебе не мешают, то бери его.

В принципе, нет - не мешают. Но программа уже написана с нитями (см. соседний тред про граббер проксей).
Так что, хотелось бы работу с MySQL именно из нитей.

P.S. connection pooling я делал, на модельных задачах работало, на реальной базе - вылетало через какое-то время по Segmentation fault (там еще база посылала сообщением «Gone away», вроде).

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

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

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

>P.S. connection pooling я делал, на модельных задачах работало, на реальной базе - вылетало через какое-то время по Segmentation fault (там еще база посылала сообщением «Gone away», вроде).

Тогда оно у тебя и с одним коннектом вылетит рано или поздно.

Пул - не более чем куча коннектов, и если ты даёшь каждому треду по коннекту, то в рамках треда это то же самое, что и просто один коннект в однопоточной программе.

А уж сегофолт базы - это совсем не питон, ищи баг.

anonymous
()

Спокойно писал данные в лист\словарь в одном потоке, в другом проверял длину, читал и чистил. Проблем не было. Думаю потому что потоки в питоне одновременно реально не работают, хотя могу ошибаться.

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

Тут ещё вопрос как он раздаёт коннекты потокам. Если юзает один питонообъект с пулом коннектов в разных потоках, то может быть тупо race condition от чего и ловит все траблы. Ещё один повод не использовать потоки, ибо даже в питоне не ими пользоваться не так просто как может показаться.

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