【问题标题】:Create objects inside or outside functions in Python?在 Python 中创建函数内部或外部的对象?
【发布时间】:2020-06-19 03:35:29
【问题描述】:

我正在使用FastAPI 开发 Python Web API。

目前它是一个非常小的应用程序,但在接下来的几个月里,我预计它会有数百个 routesservices

这是我拥有的route 的示例:

my_service_1 = MyService1()
my_service_2 = MyService2()

@router.get("/route-1")
def route_1():
    # Do something with the services

@router.get("/route-2")
def route_2():
    # Do something with the services

@router.get("/route-3")
def route_3():
    # Do something with the services

为方便起见,我将服务声明留在了文件顶部,因此文件中的所有路由都可以轻松使用它们。

我的问题是,像这样的数百个文件,一旦应用程序启动,所有路由都将被注册,因此所有服务都将被实例化。这样做是个坏主意吗?考虑到所有服务现在都加载到内存中,是否会导致内存使用过多?

这样的东西在性能/内存使用方面会更好吗?

@router.get("/route-1")
def route_1():
    my_service_1 = MyService1()
    my_service_2 = MyService2()
    # Do something with the services

@router.get("/route-2")
def route_2():
    my_service_1 = MyService1()
    my_service_2 = MyService2()
    # Do something with the services

@router.get("/route-3")
def route_3():
    my_service_1 = MyService1()
    my_service_2 = MyService2()
    # Do something with the services

如果这不是 pythonic 的做事方式,请原谅我,我来自 C# 背景。

【问题讨论】:

    标签: python python-3.x fastapi


    【解决方案1】:

    TL;DR

    根据每个请求实例化新服务可能代价高昂,而且我 如果可以的话,建议在开始时将它们全部实例化并保持 他们为即将到来的请求做好了准备。你会回复得更快(这取决于 服务)并在应用程序所需的资源之前知道。

    答案很简单:没有答案。

    别开玩笑了,这完全取决于用例。如果您有一个专用于您的应用程序的整个服务器并且没有其他应用程序在运行,那么您可以使用所有可用的资源(不是您必须使用的),因此您不会受到严格的约束。另一方面,您可能在有限的资源上运行,例如共享服务器(如云服务器),其他服务可能正在运行,从一个服务器切换到另一个服务器可能意味着信息丢失。

    我不确定“服务”是什么意思,但如果它只是一个可以在多个请求之间共享的类,那么我的建议是在模块(或包)中实例化它们并在请求之间重用它们。

    当然,如果他们需要大量资源,比如 0.5 GB 的 RAM,而您的服务器只有 1 GB 的 RAM,并且用户正在请求不同的服务,那么一旦您生成第二个服务,系统就会崩溃。

    根据我的经验,python(尤其是最新版本)对于几乎所有用例来说都足够高效。美妙之处在于您可以将其扩展,但同样,这完全取决于预期用途、上下文(服务是什么)和约束。

    示例

    最近,我一直在使用 httpx 库与我的网络应用程序中的另一个服务进行通信。我正在为每个请求实例化一个客户端(或来自requests 的会话)。在某个时候,由于流量增加,我开始遇到一些错误。

    问题在于每个请求的实例化,并且有数千个请求,意味着要不断地执行与服务的连接。因此,我实例化了一个客户端,该客户端在服务器启动时连接一次,并在不同的功能/路由之间共享。它甚至更快,因为我不必在每次请求时都连接,而只需连接一次。

    【讨论】:

    • “在模块(或包)中实例化它们并在请求之间重用它们”感谢您的建议!
    • 不客气。确保您的所有服务都已启动。请参阅fastapi.tiangolo.com/advanced/events 了解更多信息
    猜你喜欢
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多