gpt4 book ai didi

python - 为什么这个循环不每五秒显示一次更新的对象计数?

转载 作者:太空狗 更新时间:2023-10-29 20:43:02 27 4
gpt4 key购买 nike

我使用这段 python 代码每 5 秒输出一次事物的数量:

def my_count():     
while True:
print "Number of Things: %d" % Thing.objects.count()
time.sleep(5)

my_count()

如果另一个进程在 my_count() 运行时生成了一个新事物,my_count() 将继续打印相同的数字,即使它现在在数据库中已经更改。 (但如果我终止 my_count() 并重新启动它,它将显示新的事物计数。)

东西存储在一个MYSQL innodb数据库中,这段代码在ubuntu上运行。

为什么 my_count() 不重新启动就不会显示新的 Thing.objects.count()?

最佳答案

因为 Python DB API 默认处于 AUTOCOMMIT=OFF 模式,并且(至少对于 MySQLdb)处于 REPEATABLE READ 隔离级别。这意味着在幕后你有一个正在进行的数据库事务(InnoDB 是事务引擎),其中对给定行(或者甚至表,我不确定)的第一次访问修复了该资源的剩余部分的“ View ”交易。

要防止这种行为,您必须“刷新”当前交易:

  from django.db import transaction


@transaction.autocommit
def my_count():
while True:
transaction.commit()
print "Number of Things: %d" % Thing.objects.count()
time.sleep(5)

-- 注意 transaction.autocommit装饰器仅用于进入事务管理模式(这也可以使用 transaction.enter_transaction_management/leave_transaction_managemen 函数手动完成)。

还有一件事——要注意——Django 的自动提交与你在数据库中的自动提交不同——它是完全独立的。但这超出了这个问题的范围。

编辑于 22/01/2012

Here是对类似问题的“双重答案”。

关于python - 为什么这个循环不每五秒显示一次更新的对象计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221247/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com