python教程—django中计数器的原子增量-Python实用宝典

python教程—django中计数器的原子增量

我试图原子地增加Django中的一个简单计数器。我的代码看起来是这样的:如果我正确理解Django,那么应该将函数封装在事务中,并使增量原子化。但是它不起作用,计数器更新中有一个竞态条件。如何使这些代码成为线程安全的?

我试图原子地增加Django中的一个简单计数器。我的代码是这样的:

    from models import Counter from django.db import transaction @transaction.commit_on_success def increment_counter(name): counter = Counter.objects.get_or_create(name = name)[0] counter.count += 1 counter.save()

如果我正确理解Django,那么应该将函数封装在事务中,并使增量原子化。但是它不起作用,计数器更新中有一个竞态条件。如何使这些代码成为线程安全的?

回答

New in Django 1.1

    Counter.objects.get_or_create(name = name) Counter.objects.filter(name = name).update(count = F('count')+1)

或者使用和F表达式:

    counter = Counter.objects.get_or_create(name = name) counter.count = F('count') +1 counter.save( update_fields=["count"] )

记得指定要更新哪些字段,
或者您可能在模型的其他可能字段上遇到竞态条件!

与此方法关联的< A href=" https://docs.djangoproject.com/en/2.0/ref/models/expressions/#- race-conditions- use -f" rel="noreferrer">race condition 已被添加到官方文档中。

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论