sanic框架解决多进程共享缓存问题

news2024/9/25 19:20:34

最近在用sanic框架做项目,今天需要处理多进程共享缓存问题,在网上搜索了很多,知道使用multiprocessing模块,但是导入后,直接使用会报错,然后看官网解决问题。

直接看官方文档点我哦

大致意思如下:

Python provides a few methods for exchanging objects(opens new window), synchronizing(opens new window), and sharing state(opens new window) between processes. This usually involves objects from the multiprocessing and ctypes modules.

If you are familiar with these objects and how to work with them, you will be happy to know that Sanic provides an API for sharing these objects between your worker processes. If you are not familiar, you are encouraged to read through the Python documentation linked above and try some of the examples before proceeding with implementing shared context.

Similar to how application context allows an applicaiton to share state across the lifetime of the application with app.ctx, shared context provides the same for the special objects mentioned above. This context is available as app.shared_ctx and should ONLY be used to share objects intended for this purpose.

The shared_ctx will:

NOT share regular objects like int, dict, or list
NOT share state between Sanic instances running on different machines
NOT share state to non-worker processes
only share state between server workers managed by the same Manager
Attaching an inappropriate object to shared_ctx will likely result in a warning, and not an error. You should be careful to not accidentally add an unsafe object to shared_ctx as it may not work as expected. If you are directed here because of one of those warnings, you might have accidentally used an unsafe object in shared_ctx.

In order to create a shared object you must create it in the main process and attach it inside of the main_process_start listener.

翻译过来如下:

在这里插入图片描述

一个小例子

import multiprocessing
from sanic import HTTPResponse, Sanic, response
from sanic.log import logger

app = Sanic("Hw-Licence-System")
app.config.REQUEST_TIMEOUT = 180


# 创建共享的Manager对象
@app.main_process_start
async def main_process_start(app):
    app.shared_ctx.cache = multiprocessing.Manager().dict()

@app.route("/api/v1/get_data", methods=["GET"])
async def get_data(request):
    product_name = request.args.get("product_name")
    shared_cache = request.app.shared_ctx.cache
    # 尝试从共享缓存中获取数据
    if product_name in shared_cache:
        data = shared_cache[product_name]
        return response.json({"status": True, "data": data})

    # 存储到缓存
    logger.info("get data from server")
    shared_cache[product_name] = "123"
    # 获取数据并返回
    if product_name in shared_cache:
        data = shared_cache[product_name]
        return response.json({"status": True, "data": data})
    else:
        return response.json({"status": False, "message": "Data not found"})
    
    
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=3000, workers=4)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

flutter 常用组件:文本、图片和按钮

文章目录 文本控件富文本控件图片本地图片网络图片按钮文本控件 ##一’码’当先 Text(这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本这是一段文本,textAlign:TextAlign.center,style: TextStyle(fontWeight: FontWeight.bold, font…

简单好用的CHM文件阅读器 CHM Viewer Star最新 for mac

CHM Viewer Star 是一款适用于 Mac 平台的 CHM 文件阅读器软件,支持本地和远程 CHM 文件的打开和查看。它提供了直观易用的界面设计,支持多种浏览模式,如书籍模式、缩略图模式和文本模式等,并提供了丰富的功能和工具,如…

elasticsearch(ES)分布式搜索引擎01——(初识ES,索引库操作和文档操作,RestClient操作索引库和文档)

目录 1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.总结 1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排 1.3.es的一些概念1.3.1.文档和字段1.3.2.索引和映射1.3.3.mysql与elasticsearch1.4.3.总结 2.…

mysql面试题41:关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询怎么优化呢?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询怎…

[CSAWQual 2019]Web_Unagi - 文件上传+XXE注入(XML编码绕过)

[CSAWQual 2019]Web_Unagi 1 解题流程1.1 分析1.2 解题 2 思考总结 1 解题流程 这篇博客讲了xml进行编码转换绕过的原理:https://www.shawroot.cc/156.html 1.1 分析 页面可以上传,上传一句话php失败,点击示例发现是xml格式,那…

『Linux小程序』进度条

文章目录 缓冲区问题回车与换行的区别进度条小程序 缓冲区问题 假设有一段代码为: #include<iostream> #include<unistd.h> int main() …

openGauss学习笔记-96 openGauss 数据库管理-访问外部数据库-file_fdw

文章目录 openGauss学习笔记-96 openGauss 数据库管理-访问外部数据库-file_fdw96.1 使用file_fdw96.2 注意事项 openGauss学习笔记-96 openGauss 数据库管理-访问外部数据库-file_fdw openGauss的fdw实现的功能是各个openGauss数据库及远程服务器&#xff08;包括数据库、文件…

算法-DFS+记忆化/动态规划-不同路径 II

算法-DFS记忆化/动态规划-不同路径 II 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/unique-paths-ii 1.2 题目描述 2 DFS记忆化 2.1 思路 注意题意&#xff0c;每次要么往右&#xff0c;要么往下走&#xff0c;也就是说不能走回头路。但是仍有可能走到之前已经…

动态壁纸软件iWall mac中文特色

iWall for mac是一款动态壁纸软件&#xff0c;它可以使用任何格式的漂亮视频(无须转换)&#xff0c;音频(可视化功能)&#xff0c;图片&#xff0c;动画&#xff0c;Flash&#xff0c;gif&#xff0c;swf&#xff0c;程序&#xff0c;网页&#xff0c;网站做为您的动态壁纸&…

gazebo joint 中的type fixed 和continuous的区别

在 Gazebo 中&#xff0c;机器人描述中的元素type属性<joint>指定连接两个链接的关节类型。接头有多种类型&#xff0c;包括fixed和continuous。这是它们之间的区别&#xff1a; 固定关节 ( type“fixed”): 固定关节代表两个链接之间的刚性连接。它不允许连接的链接之…

初识Linux(入门篇)

文章目录 初识 Linux1、Linux 背景1.1、Linux 历史1.2、Linux 官网1.2、Linux 发行版本 2、使用 XShell 远程登录 Linux2.1、下载安装 XShell2.2、查看 Linux 主机 ip2.3、使用 XShell 登陆主机2.4、XShell下的复制粘贴 3、Linux 基本指令3.1、ls 指令3.2、pwd 指令3.3、cd 指令…

iOS 获取模拟器沙盒路径

xcrun simctl get_app_container booted Bundle Identifier data

设计模式01———简单工厂模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 任务&#xff1a;使用【简单工厂模式】生成四种不同怪物 【按不同路径移动】 首先资源商店下载四个怪物模型 接下来我们选取四个怪物作为预制体并分别起名…

华为OD机考B卷 | 100分】阿里巴巴找黄金宝箱(JAVA题解——也许是全网最详)

前言 本人是算法小白&#xff0c;甚至也没有做过Leetcode。所以&#xff0c;我相信【同为菜鸡的我更能理解作为菜鸡的你们的痛点】。 题干 1. 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0~N的箱子&…

Java常量与变量

Java常量与变量 在程序执行过程中&#xff0c;其值不能被改变的量称为常量&#xff0c;其值能被改变的量称为变量。 Java关键字 Java关键字 int public (公有的,可跨包) new finally throw (抛出一个异常对象) continuefloatlongshort extends (继承,用于类继承类) returnbrea…

ThinPlateSpline(TPS)理论和代码

ThinPlateSpline理论和代码 TPS被广泛的应用于各类的任务中, 尤其是生物形态中应用的更多: 人脸, 动物脸等等, TPS是cubic spline的2D泛化形态. 值得注意的是, 图像处理中常用的仿射变换(Affine Transformation), 可以理解成TPS的一个特殊的变种. 暂时先整理相关资源,后面详细…

C++:关于模拟实现vector和list中迭代器模块的理解

文章目录 list和vector的迭代器对比list的实现过程完整代码 本篇是关于vector和list的模拟实现中&#xff0c;关于迭代器模块的更进一步理解&#xff0c;以及在前文的基础上增加对于反向迭代器的实现和库函数的对比等 本篇是写于前面模拟实现的一段时间后&#xff0c;重新回头…

逍遥魔兽:如何在服务器上挂机器人?

逍遥魔兽是一款备受欢迎的魔兽世界经典版本&#xff0c;对于许多玩家来说&#xff0c;为了提升游戏体验和效率&#xff0c;他们希望能够在服务器上挂机器人。本文将为您详细讲解如何实现在逍遥魔兽服务器上挂机器人&#xff0c;以提高游戏进程的自动化效率。 第一部分&#x…

正则表达式(Regular Expression)学习网址分享

正则表达式&#xff08;Regular expressions&#xff0c;也叫REs、 regexs 或regex patterns&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"&#xf…

数据库系统工程师------流水线

流水线 流水线周期&#xff1a;工序中最长的那段执行时间。 流水线计算公式&#xff1a;第一条指令计算时间 &#xff08;指令条数 - 1&#xff09;*流水线周期。 流水线吞吐率&#xff1a;指单位时间内流水线完成的任务数量或输出的结果数量。 流水线的加速比&#xff1a;完…