1.为视图访问增加计时器
有的时候,我们会有这种需求,在网页中显示该网页的访问数量,此时就需要增加计时器,但是一般的计时器会存在一些问题:
(1)WSGI服务器会将Flask服务生成多个进程,每个进程都有自己的独立副本,重复的请求会由不同的进程处理,从而产生不同步的值;
(2) 假如Flask服务异常终止,计数就会清零。
此时可以按照如下方法解决:
(1)multiprocessing模块;
(2)保存到数据库中。
第一种方式原理为:
使用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)
此时可以实现同步计时,但是如果应用程序进程分布在多台计算机上,则共享内存也会存在问题:它们仅在本地计算机上同步,而不是在网络上同步。
最可靠的还是直接将计数保存到数据库,对于访问路由对应的对象模型增加一个字段,每访问一次就操作数据库,对该字段加一,这样就不存在上面的问题了。