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

每次访问Flask视图时的增量计数器

佴阳辉
2023-03-14
问题内容

当用户访问我的Flask应用中的页面时,我想增加一个计数器。如果有两个用户访问该页面,则计数应增加2。我尝试了以下操作,但计数始终为1。如何增加每次访问的值?

@app.route('/count')
def make_count():
    count = 0
    value = count + 1
    return jsonify(count=value)

问题答案:

同时计数很难。假设计数为0。如果两个用户都以足够近的时间间隔命中端点,则他们每个人可能会得到值0,将其递增为1,然后放回原值。有两个用户命中了端点,但最终计数为1,而不是2。要解决此问题,您需要使用支持原子递增的数据存储(例如,一次只能有一个进程执行的操作)。

您不能使用简单的Python,global因为WSGI服务器将产生多个进程,因此它们每个都有各自独立的全局副本。重复的请求可以由不同的进程处理,从而导致不同的,不同步的值。

最简单的解决方案是Python
multiprocessing.Value。只要在创建值后就生成了进程,就可以同步跨进程访问共享值。

from flask import Flask, jsonify
from multiprocessing import Value

counter = Value('i', 0)
app = Flask(__name__)

@app.route('/')
def index():
    with counter.get_lock():
        counter.value += 1
        out = counter.value

    return jsonify(count=out)

app.run(processes=8)
# access http://localhost:5000/ multiple times quickly, the count will be correct

还有一些警告:

  • 只要管理器处于活动状态,数据就一直存在。如果重新启动服务器,计数器也会重置。
  • 如果应用程序进程分布在多台计算机上,则共享内存将遭受与全局内存相同的问题:它们仅在本地计算机上同步,而不在网络上同步。

对于现实世界的场景,Redis是一个更强大的解决方案。服务器独立于Web应用程序,具有持久性选项,并且可以进行原子增量。它也可以用于应用程序的其他部分,例如缓存



 类似资料:
  • 准备数据: CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, day INT(2) UNSIGNED ZEROFILL); INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2), (2000,2

  • 接口说明 增加素材预览访问次数 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /wish3dearth/api/material/v1.0.0/addMaterialViewCount 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 token string header 是 当前登录用户的TOKEN mat

  • 接口说明 增加素材预览访问次数 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 POST /wish3dearth/api/material/v1.

  • 我是sqlite3的新手。我通过python在SQLite中导入了一个导出的CSV文件,其中列出了来自Splunk的IP地址,我计划在每次识别类似的IP地址时增加数据库中的count列。 我的想法是使用SQLite CASE语句,留档,更新语句等。 也试过, 我知道我错了,我好几天都搞不清楚这个问题。下面是我的sqlite3数据库在cmd提示符中的样子: 我会继续寻找解决方案。感谢您的反馈!

  • 我正在开发一个android应用程序,用户可以阅读博客和文章。我想在我的android应用程序中计算浏览量。我正在使用recyclerView来显示列表项,并通过使用名为getArticles.php的API成功地实现了这一点,它通过单击列表项来显示来自webservices的JSON数据。我有另一个名为incrementViews.php的API,params是{article_id=3},它将

  • 我正在寻找一个查询,它将:读取一列中一行的当前值,将其与上面的行进行比较,如果上面的行匹配,则依次计数。本质上,这听起来像是一个运行计数,而不是计数(*),几乎就像行应该在每一组行上执行计数(变量)-1,直到它达到最小零。下面的示例假设我们有一个每日销售额列表,并计算给定产品ID的出现次数。这有可能吗? 选择Count(ProductID)作为SalesCount未知公式作为SalesOccurr