如何避免Python API服务器中的重复处理? [复制]

2024-01-12

假设一个函数detect_primes调用起来很昂贵,我想避免使用重复的参数重复调用它。我应该怎么办?

使用缓存没有帮助,因为该函数可能会在不同的请求中同时调用。当两个请求都将缓存视为空值时,两个请求都将继续执行昂贵的函数。

def detect_primes(nums: List[int]) -> Dict[int, bool]:
    """ detect whether a list of numbers are prime """
@app.route('/detect', methods=['GET'])
def search():
    args = request.args
    nums = list(map(int, args.get('nums', '').split(',')))
    return detect_primes(nums)

例如,如果一个用户请求 13,14,15,则另一个用户请求 15,16。 答案是{"13": true, "14": false, "15": false} and {"15": false, "16": false}

我想避免打电话detect_primes with [13, 14, 15] and [15, 16]。理想情况下,两个请求都应该等待调用[13, 14, 15, 16](或两次调用[13, 14, 15] and [16]),并返回相应的结果。

Web框架的选择对我来说并不重要,你可以假设它是flask或fastapi。

编辑:不确定问题如何重复或如何回答Flask 中的全局变量是线程安全的吗?如何在请求之间共享数据? https://stackoverflow.com/questions/32815451/are-global-variables-thread-safe-in-flask-how-do-i-share-data-between-requests如上所述,无法使用缓存(无论是内存中的 python 缓存还是外部缓存或数据库)。我很高兴被答案证明是错误的。


As per FastAPI 的文档 https://fastapi.tiangolo.com/async/:

当您使用正常声明路径操作函数时def代替async def,它在外部线程池中运行,然后await编辑, 而不是直接调用(因为它会阻塞服务器)。

因此,当您使用def代替async def服务器同时处理请求。

就你的情况而言——既然你将其描述为“理想情况下,两个请求都应该等待......”——你可以定义search端点与async def https://fastapi.tiangolo.com/async/. Async路由在主线程(事件循环)上运行,服务器按顺序处理请求 -只要没有 await调用某个协程(即async函数)在此类路线内,在这种情况下await将把函数控制传递回事件循环,允许循环运行其他任务/请求(请查看这个答案 https://stackoverflow.com/a/71517830/17865804了解更多详细信息和解决方案)。通过这种方式,您可以使用字典来缓存先前(已经计算出的)数字,并使用它在后续请求中快速查找特定数字。您还可以使用类似的方法来限制字典的大小this https://stackoverflow.com/questions/2437617/how-to-limit-the-size-of-a-dictionary。下面给出示例。您可以通过 OpenAPI 测试以下内容:http://127.0.0.1:8000/docs http://127.0.0.1:8000/docs,或者使用诸如这样的 URL.

from fastapi import FastAPI, Query
from typing import List, Dict

app = FastAPI()
d = {}

def is_prime(n) -> bool:
    # check whether 'n' is prime or not

def detect_primes(nums: List[int]) -> Dict[int, bool]:
    res = {}
    for n in nums:
        if n in d:
            res[n] = d.get(n)
            print(f'{n} found in dict')
        else:
            is_n_Prime = is_prime(n)
            res[n] = is_n_Prime
            d[n] = is_n_Prime
    return res

@app.get("/detect")
async def search(nums: List[int] = Query(...)):
    return detect_primes(nums)

但是,如果您需要使用await在你的async def路由(这将导致请求同时处理),您可以使用,例如Semaphore https://docs.python.org/3/library/threading.html#semaphore-objects对象控制对字典的访问,如所述here https://stackoverflow.com/a/42325186/17865804。但是,如果您打算拥有多名工人 https://fastapi.tiangolo.com/deployment/server-workers/同时活跃,每个工人都有自己的东西和变量——工人不共享相同的内存 https://fastapi.tiangolo.com/deployment/concepts/#memory-per-process—您应该考虑使用数据库存储或键值存储(缓存),例如Redis(看看答案here https://stackoverflow.com/a/71537393/17865804 and here https://stackoverflow.com/a/65699375/17865804)。另外,您可能想尝试使用aioredlock https://github.com/joanvila/aioredlock,它允许“在工作人员(进程)之间创建分布式锁”,如上所述here https://stackoverflow.com/a/64911338/17865804.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免Python API服务器中的重复处理? [复制] 的相关文章

随机推荐

  • 安卓。 getHistorySize 和 getHistoricalX/Y

    我已经覆盖了onTouchEvent 方法在我的View类 并试图处理EventMotion ACTION MOVE 我使用以下代码 if event getAction MotionEvent ACTION MOVE historySiz
  • 是否可以在两台机器上使用相同的 ssh 私钥/公钥对来访问 git 存储库?

    我最近设置了一个内部 git 存储库服务器 并安装了 gitosis 作为管理工具 并将其启动并运行 只读访问可通过 git 协议获得 写访问可通过使用 ssh 公钥的 gitosis 获得 我有一位开发人员已被授予使用在其桌面工作站上生成
  • 如何指定自定义 libc++

    我已经构建了 libc 并且想在编译程序时使用它 所以我有类似的东西 clang stdlib libc libc so main cpp 但这不起作用 在构建应用程序时如何使用我的自定义构建的 libc 此信息来自关于 libcxx 的
  • iPhone TCP 连接

    我想在iPhone和PC之间建立tcp连接 在 PC 上 QTspServer 正在运行并工作 已与其他客户端应用程序进行测试 这是我在 iPhone 上使用的连接方法 IBAction connectToServer id sender
  • 为什么没有像 MSG_WAITALL 这样的标志用于发送?

    旗帜MSG WAITALL可用于recv 这要求recv阻塞直到满足完整的请求 这意味着recv直到达到请求的数据量 由参数指定 才会返回len 已收到 除非发生错误或连接已关闭 为什么这样的标志不适用于send也 我认为这对于发送非常有用
  • 最好的基于 jquery 的灯箱/弹出对话框?

    我正在寻找一个基于 jquery 的弹出对话框 我们将使用它 显示静态内容页面 使用条款等 联系我们页面 已经使用 jquery 表单插件进行 ajax 提交 显示全尺寸的照片缩略图 有人可以推荐一款可以满足上述所有要求并且相当轻量级且易于
  • 如何确定 EventLog 是否已存在

    我正在使用以下行创建新的事件日志 new eventlog LogName Visual Studio Builds Source Visual Studio 我想每次都运行它 因为如果我从新计算机运行构建 我仍然希望查看事件日志 问题是
  • asp.net webforms ajax 更新 gridview

    我们有一个包含大量信息 100 行或行和列 的网格视图 我们需要提高其性能 目前 为了解决一些性能问题 我们使 gridview 没有编辑模板 而是双击一个单元格将弹出一个可用选项的下拉列表 该选项是使用 webmethods 检索并使用
  • jekyll:检查是否没有帖子

    如何查看帖子里是否没有帖子 posts folder 到目前为止 我已经尝试过 if site posts null p No posts yet p endif and if site posts nil p No posts yet p
  • 从 VB 转换为 C#

    我的任务是将解决方案从 VB 转换为 C 有 22 个项目和数百个类 所以我决定研究转换器 我最终选择了 SharpDevelop 这是一个带有转换器的 IDE 我在每个项目上都运行了它 并且有很多错误需要修复 但我应该能够检查它们并希望找
  • Sequelize 增量函数返回错误

    尝试增加我的数据库中模型实例的整数字段 这是相关代码 models Options findAll where PollId poll id name option to update then option gt option incre
  • 删除网址中的主题标签,刷新 f5 时出错(angularJs-cordova)

    我对 AngularJs 中的路由器有一些疑问 我使用了 Angular UI Router 但是当使用 locationProvider 删除 url 中的主题标签 时出现错误 如何解决这个问题 在我的模块中 config functio
  • 使用 JNI 从 C++ 调用 JAVA 方法,无参数

    请耐心听我说 我是一名 iPhone 开发人员 而整个 Android 这让我有点困惑 我有一些从 cocos2d x CCMenuItem 调用的 C 方法 因此 根据文档 我无法发送任何参数 我需要使用 android 浏览器打开一个
  • CSS 箭头在 jQuery SlideUp 或 SlideDown 动画期间隐藏

    我有一个使用 CSS 创建的顶部带有箭头的 div arrow box position relative display none background 88b7d5 border 4px solid c2e1f5 padding 20p
  • 在 ExtJS 中,如何循环菜单项?

    如何循环遍历 ExtJS 工具栏菜单中的所有项目 例如更改其图标 使用 each 方法混合系列 http dev sencha com deploy dev docs class Ext util MixedCollection按钮菜单中的
  • 为什么 XmlDocument.LoadXml 抛出 System.Net.WebException?

    为什么System Xml XmlDocument LoadXml方法抛出System Net WebException 这真是令人难以置信的疯狂 如果MSDN http msdn microsoft com en us library s
  • python 中的专用 @property 装饰器

    我有几个类 每个类都有许多属性 所有属性的共同点是它们应该是数字属性 这似乎是使用 python 装饰器的理想场所 但我似乎无法完全理解正确的实现是什么 这是一个简单的例子 class Junk object def init self v
  • 在 VSCode 中包含 d.ts 类型定义文件

    我已经开始使用 VSCode 0 7 0 并注意到注释说你不必添加 不再参考 引入 jsconfig json 后 您不再需要在每个文件中使用 引用 这些在 VS Code 的初始版本中是必需的 由于文件集是在 jsconfig json
  • python Anaconda 中的 Mayavi

    我安装了mayavi在 Anaconda 中使用命令 conda exe install mayavi 在 Anaconda 命令提示符中 现在 当我关闭 Spyder 时 它就不再打开了 我该如何解决 我正在使用Windows 我想展示我
  • 如何避免Python API服务器中的重复处理? [复制]

    这个问题在这里已经有答案了 假设一个函数detect primes调用起来很昂贵 我想避免使用重复的参数重复调用它 我应该怎么办 使用缓存没有帮助 因为该函数可能会在不同的请求中同时调用 当两个请求都将缓存视为空值时 两个请求都将继续执行昂