我正在使用FastAPI编写Python。
目前,它是一个非常小的应用程序,但在接下来的几个月里,我希望它有几百个routes和services。
这是我所拥有的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请原谅我,如果这不是一种奏鸣曲的做事方式,我来自C#背景。
发布于 2020-06-19 16:54:18
TL;DR 在每个请求中实例化一个新服务可能代价很高,如果可以的话,我建议在开始时实例化它们,并使它们随时为即将到来的请求做好准备。你会回复得更快(这取决于服务),并且在应用程序需要的资源之前就知道了。
答案很简单:没有答案。
除了笑话之外,这一切都取决于用例。如果您有一个专用于您的应用程序的整个服务器,而没有运行其他应用程序,那么您可以使用所有可用的资源(这不是您必须使用的资源),因此您不会受到严格的约束。另一方面,您可能运行在有限的资源上,例如共享服务器(如云服务器),其中其他服务可能正在运行,从一个服务器切换到另一个服务器可能意味着信息的丢失。
我不知道“服务”是什么意思,但是如果它只是一个可以跨多个请求共享的类,那么我的建议是在一个模块(或包)中实例化它们,并在请求中重用它们。
当然,如果它们需要大量的资源,比如0.5GB的RAM,而您的服务器只有1GB的RAM,并且用户正在请求不同的服务,那么一旦您生成第二个服务,系统就会崩溃。
在我的经验中,python (特别是最新版本)对于几乎所有用例来说都足够有效。它的优点是您可以扩展它,但是同样地,这取决于预期的使用、上下文(服务是什么)和约束。
示例
最近,我一直在使用httpx库与我的web应用程序中的另一个服务进行通信。我为每个请求实例化了一个客户机(或来自requests的用户的会话)。在某种程度上,由于流量的增加,我开始犯一些错误。
问题是每一个请求都要实例化,并且有数千个请求,这意味着要连续地执行与服务的连接。因此,我实例化了一个客户机,它在服务器启动时连接一次,并在不同的功能/路由之间共享。它甚至更快,因为我不需要在每一个请求中连接,而是只连接一次。
https://stackoverflow.com/questions/62462843
复制相似问题