当用户访问我的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应用程序,具有持久性选项,并且可以进行原子增量.它还可以用于应用程序的其他部分,例如缓存.
| 归档时间: |
|
| 查看次数: |
5745 次 |
| 最近记录: |