导入只有一个请求将在AppEngine上使用的高级库的最有效方法是什么?

时间:2014-08-12 05:14:39

标签: python google-app-engine

该库是libphonenumbers的python端口

它只会很少使用

我通常会在每个请求使用的公共位置导入库,但是,导入此库会削弱应用程序的性能,导致实例开始变慢,这是我的担忧。

那么在使用它的函数中将其内联导入是合乎逻辑的吗?

我猜这种或那种方式,它会加载到内存中并增加内存使用量,但是,在使用时内联导入它可能会增加实例冷启动性能

会出现这种情况吗?

1 个答案:

答案 0 :(得分:1)

导入库的实际时间大致相同,无论是在实例启动时还是按需执行,在需要它的特定请求中内联。类似地,一旦加载,库的内存占用量就相同。

因此,对于实际需要库的请求 - 它并不重要。

但对于其他请求,它可能很重要,可能很多。

在实例启动时盲目加载所有可能需要的库意味着实例将启动较慢并且将使用比仅加载触发实例启动的请求所必需的库更多的内存。但是一旦实例启动,所有后续请求都将受益于最短响应时间 - 不需要加载其他代码,而在另一种情况下,某些后续请求的响应时间将增加导入尚未导入的库(每个实例生存期每个库一次)。

有些人会认为在启动时导入所有库的应用程序比其按需导入对应程序更昂贵,启动更慢,更笨重。其他人会认为它们在性能方面更具确定性,对某些应用来说可能很重要

按需导入库,特别是很少使用的高级库,提供了一个独特的优势:即使所有库的总内存占用量超过实例的内存限制,应用程序也可以(至少部分或降级模式)运行type - 如果在实例启动时尝试加载所有lib,那将是不可能的。

按需导入的变体是延迟加载包含请求处理程序代码的整个文件,请参阅App Engine: Few big scripts or many small ones?这里有一个实际示例:What determines start up time of dynamic instance and can it vary between weeks if code is same