Django数据库和线程

时间:2012-08-24 15:05:17

标签: python mysql django multithreading

在一个模型中,我有update()方法,它更新了几个字段并创建了一个其他模型的一个对象。问题是我用来更新的数据是从另一个主机获取的(每个对象都是唯一的),它可能需要一些时间(主机可能处于脱机状态,超时设置为3秒)。现在,我需要更新几百个对象,每小时3-4次 - 当然连续更新每个对象都不是一个选择,因为它可能需要一整天。 我的第一个想法是将它分成50-100个线程,这样每个线程都可以更新自己的部分对象。 99%的更新功能时间正在等待服务器响应(只有少量字节的数据,所以ping是问题),我认为CPU不会有问题,我更担心:

  • Django ORM。可以处理吗?获取所有对象,将其拆分,并从> 50个线程更新?
  • 解决这个问题是个好主意吗?如果是 - 如何做,不要搞砸数据库?或者也许我不应该关心这么少的记录?
  • 如果这不是一个好方法,怎么做呢?

2 个答案:

答案 0 :(得分:6)

您可以手动执行来自不同线程的操作(例如,使用Queue和执行程序池),但您应该注意,Django的ORM管理线程局部变量中的数据库连接。所以每个新线程=与数据库的新连接(对于一个请求,对于50-100个线程来说不是一个好主意 - 连接太多)。另一方面,您应该检查数据库“bandwith”。

答案 1 :(得分:1)

线程应该非常适合这种工作。 (@ g19fanatic:当然,GIL不会成为一个问题,因为这些任务不是cpu绑定的 - 这与使用多处理没有意义的原因相同......或者担心核心的数量)< / p>

Django ORM可以处理这个问题,但是根据你正在做的事情,你可能需要使用transactions - 但是如果可以避免,请尽量不要让事务保持打开3秒。

通常,我建议使用threading.Queue和生产者/消费者模式(例如this页面的底部),但是,因为你知道任务的数量是合理的,你的任务需要很长时间(3秒)您可能只是将它们全部产生并让操作系统弄明白: - )