Как обеспечить, чтобы несколько процессов Python обращались к базе данных один за другим? - PullRequest
0 голосов
/ 08 марта 2012

У меня запущено много скриптов: скребки, шашки, уборщики и т. Д. У них есть кое-что общее:

  • они работают вечно;
  • они не имеют ограничений по временичтобы завершить свою работу;
  • все они имеют доступ к одной и той же базе данных MYSQL, пишут и читают.но зависит от этих сценариев.

    Я могу использовать очереди с Kombu для встраивания всех записей.

    Но знаете ли вы способ сделать то же самое с чтением?

    EG: если одному сценарию нужно прочитать из БД, его запрос отправляется в очередь блокировки, и возобновляется ли он после получения ответа?Таким образом, каждый делает запрос к одному процессу, и этот процесс - единственный, кто общается с БД и делает один запрос за раз.

    Я понятия не имею, как это сделать.

    Конечно, в конце мне, возможно, придется добавить больше серверов к миксу, но до этого, могу ли я что-то сделать на уровне программного обеспечения?

Ответы [ 3 ]

1 голос
/ 08 марта 2012

Вы говорите, что ваш набор данных <1 ГБ, проблема связана с ЦП. </p>

Теперь начните анализировать то, что питается циклами процессора:

  • Какие запросы действительно медленные и часто выполняются. MySQL может регистрировать эти запросы.
  • А как насчет медленных запросов? Можно ли их ускорить, используя индекс?
  • Есть ли неиспользованные индексы? Брось их!
  • Ничего не помогает? Можете ли вы решить эту проблему путем денормализации / предварительного вычисления?
1 голос
/ 08 марта 2012

Вы можете использовать диспетчер соединений и сделать так, чтобы соединения из скриптов проходили через него. Это ограничит количество реальных подключений к вашей БД и будет прозрачным для ваших сценариев (их подключения будут удерживаться в состоянии «ожидания» до тех пор, пока не будут освобождены реальные подключения).

Я не знаю, какую БД вы используете, но для Postgres я использую PGBouncer по аналогичным причинам, см. http://pgfoundry.org/projects/pgbouncer/

0 голосов
/ 08 марта 2012

Вы можете создать функцию, которую каждый процесс должен вызывать для связи с БД.Вы можете переписать сценарии так, чтобы они вызывали эту функцию, а не общались напрямую с БД.Внутри этой функции у вас может быть блокировка на основе области действия, так что только один процесс будет одновременно общаться с БД.

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