在 Python 中在函数内部或外部创建对象?

Create objects inside or outside functions in Python?

我正在使用 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

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

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

这样的东西在 performance/memory 用法方面会更好吗?

@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# 背景。

TL;DR

Instantiating a new service at every request may be costly and I advice, if you can, to instantiate them all at the beginning and keep them ready for upcoming requests. You will reply faster (it depends on the service) and know before the resources that are needed by the app.

答案很简单:没有答案。

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

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

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

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

例子

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

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