当前位置: 首页 > 面试题库 >

django中计数器的原子增量

宿洋
2023-03-14
问题内容

我正在尝试以原子方式在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,则应将函数包装在事务中并使增量成为原子。但这不起作用,并且计数器更新中存在竞争条件。如何使此代码成为线程安全的?


问题答案:

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"] )

请记住指定要更新的字段,否则您可能在模型的其他可能字段上遇到竞争条件!



 类似资料:
  • Go里面的管理协程状态的主要机制就是通道通讯。这些我们上面的例子介绍过。这里还有一些管理状态的机制,下面我们看看多协程原子访问计数器的例子,这个功能是由sync/atomic包提供的函数来实现的。 package main import "fmt" import "time" import "sync/atomic" import "runtime" func main() { // 我们

  • 问题内容: 希望这是一种快速/简便的方法。我知道一种通过自定义模板标签解决此问题的方法,但是我很好奇是否还有其他方法在寻找。我已经为博客创建了各种图库功能,并且有一个图库列表页面可以对我的所有画廊进行分页。现在,我不想显示该列表中每个画廊的所有照片,因为如果每个画廊甚至有20张图像,那么如果我分5篇文章,那一页上就只有100张图像。那会很浪费,而且是处理问题的错误方法。 我的问题是,有没有办法只显

  • 问题内容: 如果长变量声明为:- 私有易失性长计数器= 0; 现在,如果我使用预增量运算符对其进行增量,那么该操作将是原子的吗? 如果是,那么它将比对象的增量效率更高吗? 问题答案: 关键字只能解决可见性问题。您必须使用或方法/块来实现原子性(并发编程中的原子性)。 今天又发表了一篇文章:演示何时需要挥发物

  • 问题内容: 这是我的mysql查询 我想沿着边名选择一个增量计数器。所以预期的输出将是 问题答案: 这部分: 使得可以引入变量而无需单独的查询。因此,第一个查询也可以分为以下两个查询: 例如在存储过程中使用时。

  • 我看到Cloud Functions引用实时数据库的增量计数器,但还没有看到Firebase FiRecovery。 我有一个侦听新文档的云功能: 我正在尝试上述事务,但当我在terminal中运行时,我得到以下错误: error Each then()应该返回一个值或抛出promise/always return函数predeploy error:命令以非零退出代码1终止 这是我第一次尝试任何节

  • 我正在遍历一个LinkedHashMap并递增I counter,下面是我使用for循环的方式