Django 1.1 信号 - 线程奇怪的计时问题



我有一个模型(采购订单 - 缩写为PO(持有时间预算。用户可以将工时记录添加到此预算中,其中每个小时记录都会减少剩余预算。

我实施了更新剩余预算的信号。添加一小时记录后,预算会相应减少。由于计算可能很耗时,因此我为此任务使用了线程。

def update_po_remaining_value(sender, instance, **kwargs):
    CalculatePOThread(sender, instance).start()   
post_save.connect(update_po_remaining_value, sender=HourRecord)       
post_delete.connect(update_po_remaining_value, sender=HourRecord) 

线程 CalculatePOThread 通过获取小时记录集并从预算中扣除总小时记录集来计算剩余的 PO 预算值

hr_set = HourRecord.objects.filter(purchase_order = po)

在我的dev.workspace上,这工作得很好。在生产中,post_save连接也可以正常工作,但是我遇到了post_delete信号的奇怪问题。经常发生的情况是,查询 HourRecord.objects.filter(purchase_order = po( 返回的小时记录的总和仍然包括触发 CalculatePOThread 线程的已删除小时记录。

无论如何,我在执行查询之前通过向线程添加 6 秒的延迟来规避该行为。 时间.睡眠(6(.

有人知道为什么会出现这种情况吗? 似乎在记录真正从数据库中删除之前触发了post_delete信号..!?但这将是 Django 中的一个错误,这将是我最后的猜测。

很难

说,但我猜你遇到了线程安全问题。当您生成一个线程来处理长时间运行的任务时,您必须意识到,当它尝试完成时,类似的线程很容易被触发相同的任务。通常,在使用线程时,您希望保持其占用空间最小,或者换句话说,不要使它们高度依赖于数据库状态等。

如果需要数据库访问(在这种情况下(,则需要建立锁以防止数据库同时被弄乱。不过,考虑到您运行的是 Django 1.1,这将更加困难。如何在 Django 1.1 中实现表级锁定将取决于你正在运行的数据库服务器,并保证它自己的问题。

最新更新