【发布时间】:2012-05-07 19:47:58
【问题描述】:
我有一个模型(PurchaseOrder - 缩写为 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 秒的延迟来规避该行为。时间.sleep(6)。
有人知道为什么会发生这种情况吗?似乎在记录真正从数据库中删除之前触发了 post_delete 信号..!?但这将是 Django 中的一个错误,这将是我最后的猜测。
【问题讨论】:
标签: django multithreading django-signals