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

Ant*_*ony 8 python flask

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

@app.route('/count')
def make_count():
    count = 0
    value = count + 1
    return jsonify(count=value)
Run Code Online (Sandbox Code Playgroud)

dav*_*ism 11

同时计数很难.假设计数为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

    return jsonify(count=counter.value)

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

还有一些警告:

  • 只要经理还活着,数据就会持续存在.如果重新启动服务器,计数器也会重置.
  • 如果应用程序进程分布在多台计算机上,则共享内存会遇到与全局变量相同的问题:它们仅在本地计算机上同步,而不是在网络上同步.

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