7

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

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

2 回答 2

7

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

于 2012-08-24T19:34:03.653 回答
1

线程应该非常适合这种工作。(@g19fanatic:当然,GIL 不会成为问题,因为这些任务不受 cpu 限制——这与使用多处理没有意义的原因相同......或者担心核心数量)

Django ORM 可以处理此问题,但根据您的操作,您可能需要使用事务——但如果可以避免,请尽量不要将事务保持打开 3 秒。

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

于 2012-08-24T18:47:11.630 回答