您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Flask中的全局变量是线程安全的吗?如何在请求之间共享数据?

Flask中的全局变量是线程安全的吗?如何在请求之间共享数据?

您不能使用全局变量来保存此类数据。它不仅不是线程安全的,也不是进程安全的,并且生产中的WSGI服务器产生了多个进程。如果您使用线程来处理请求,不仅计数会错误,而且还会根据处理该请求的进程而有所不同。

使用Flask外部的数据源来保存全局数据。数据库,内存缓存或Redis都是适合的单独存储区域,具体取决于您的需求。如果您需要加载和访问Python数据,请考虑multiprocessing.Manager。您还可以将会话用于每个用户的简单数据。

开发服务器可以在单线程和进程中运行。您将看不到您描述的行为,因为每个请求都将被同步处理。启用线程或进程,您将看到它。app.run(threaded=True)或app.run(processes=10)。(在1.0中,服务器认为线程化。)

某些WSGI服务器可能支持gevent或其他异步工作器。全局变量仍然不是线程安全的,因为仍然没有针对大多数竞争条件的保护措施。您仍然可以设想这样一个场景:一个工作人员获取一个值,产生了收益,另一个工作人员对其进行了修改,产生了收益,然后第一个工作人员也进行了修改

如果在请求期间需要存储一些全局数据,则可以使用Flask的gobject。另一个常见的情况是管理数据库连接的某些顶级对象。这种“全局”类型的区别在于,它对于每个请求都是唯一的,在请求之间不使用,并且有一些东西可以管理资源的建立和拆除。

Python 2022/1/1 18:33:16 有251人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶