在Flask Restful API应用程序中更新加载的数据

时间:2019-02-11 14:40:59

标签: python flask gunicorn flask-restful

我正在寻找在已部署的应用程序中重新加载数据的最佳选择。 Best的定义是,不得导致500s,并且必须更新数据(不会默默地失败),不应阻塞工作时间太长,但是请勿将500s和更新作为优先级。

该应用程序是受CPU限制的应用程序,我正在通过添加更多的工作程序和内核进行扩展。该应用会在启动时通过

加载listdict
api.add_resource(
Cars,
'/cars',
resource_class_kwargs={'carslist': carslist})

问题在于,每24小时或更频繁地,汽车列表会发生变化。我可以制作一个POST方法,将新方法发送到应用程序,或使其加载新版本等。但是我的问题是,如果我将其与gunicorn一起部署并说8个工作人员,我如何确保每个工作人员都拥有最新的carslist

根据gunicorn文档,我还可以使用HUP优雅地重新启动gunicorn。因此,重新启动应用程序并使其加载新的carslist是最好的选择吗?或者我该如何请求每个工作者被调用?

我在docker上的nginx后面使用了gunicorn,并且该应用程序没有面向互联网,因此安全性不是问题,但有时确实会在一秒钟内看到10000s的请求。

1 个答案:

答案 0 :(得分:1)

有不同的方法来执行任务,这取决于您对员工需要多快地赶上新价值,如何在此价值发生变化时宣布它们以及对性能的要求有何限制。这些解决方案的共同之处在于,当carlist是具有以下接口的类对象时,更容易控制class CarlistManager: def __init__(self): super().__init__() self.carlist = self.update() def update(self): self.carlist = ... # depends on where you store a carlist def get(self): if not self.is_up_to_date(): self.update() return self.carlist def is_up_to_date(self): # depends on how do you prefer to check for a new file version app = Flask("app") app.carlist_manager = CarlistManager() api.add_resource(Cars, '/cars', resource_class_kwargs={'carslist': app.carlist_manager})

{
  "test": [
    1,
    2,
    3,
    4
  ]
} 

如果您有数据库,则可以在其中存储一些值,例如最新清单的文件名,在新发布的文件上对其进行更新,并检查is_up_to_date中是否已更改。这样,您就可以在运行时中更改值,而无需重新启动任何工作程序。