如何确保几个Python进程逐一访问数据库



我运行了很多脚本:scrapers、checkers、cleans等。它们有一些共同点:

  • 他们永远在奔跑
  • 他们完成工作没有时间限制
  • 他们都访问同一个MYSQL数据库,写和读

随着这些脚本的积累,网站的运行速度开始放缓,该网站在同一系统上运行,但依赖于这些脚本。

我可以使用Kombu的队列来内联所有的写入。

但是,你知道如何在阅读中做到这一点吗?

E.G:如果一个脚本需要从DB中读取,他的请求会被发送到一个阻塞队列,当它得到答案时,它会继续吗?这样,每个人都向一个进程发出请求,而这个进程是唯一一个与DB对话的进程,一次发出一个请求。

我不知道该怎么做。

当然,最后我可能不得不在组合中添加更多的服务器,但在此之前,我能在软件级别做些什么吗?

您可以使用连接池,并使脚本中的连接通过它。这将限制进入数据库的真实连接数量,同时对脚本透明(在释放真实连接之前,它们的连接将保持"等待"状态)。

我不知道你用的是什么数据库,但对于Postgres,我使用PGBouncer也是出于类似的原因,请参阅http://pgfoundry.org/projects/pgbouncer/

您说您的数据集是<1GB,问题出在CPU上。

现在开始分析CPU周期的消耗:

  • 哪些查询确实很慢并且经常执行。MySQL可以记录这些查询
  • 那么慢速查询呢?可以通过使用索引来加速它们吗
  • 是否有未使用的索引?放下它们
  • 没有什么帮助?你能通过反规范化/预计算来解决它吗

您可以创建一个函数,每个进程都必须调用该函数才能与DB对话。您可以重新编写脚本,以便它们必须调用该函数,而不是直接与DB对话。在该函数中,可以有一个基于作用域的锁,这样一次只有一个进程与DB对话。

最新更新