如何在Flask关闭时保存数据

时间:2019-03-21 15:44:51

标签: flask shutdown

我有一个Flask应用程序,它可以接收发布数据,处理数据并发送到AWS存储。对AWS的调用非常耗时,因此我将数据批处理到一个全局对象中,该全局对象在数据量达到某个预定大小时将数据发送到AWS服务。

如果应用程序关闭,则我可能不希望丢失该缓存中的数据。是否可以使用某种通知来检测关闭状态,以便刷新数据?

我在类上尝试了一种__del__方法,但是在终止序列中调用该方法为时已晚,并且所有必需的对象都已被销毁。

示例:

 class BufferedKinesisWriter:
    def __init__(self,stream_name, max_buffer_len = 100, max_buffer_size = 5000000):
        self.stream_name = stream_name
        self.kinesis_stream = KinesisStream(stream_name)
        self.max_buffer_len = max_buffer_len
        self.max_buffer_size = max_buffer_size

        self.buffer = []
        self.buffer_size = 0

    def send(self, data):
      self.buffer.append({"Data": data, "PartitionKey": partition_key})
      self.buffer_size += data_len + key_len
      print "BUFFER LENGTH: ", len(self.buffer)

      # Send the record if we have reached count
      if len(self.buffer) >= self.max_buffer_len:
        response = self._flush()

    def _flush(self):
      if len(self.buffer) == 0:
        return
      response = self.kinesis_stream.put_records(self.buffer)
      self.buffer = []
      self.buffer_size = 0
      return response

在我的Flask应用中,我有类似以下代码:

app = Flask(__name__)
api = Api(app)


# Load the configuration
config = helpers.Config()
kinesis_writer = helpers.BufferedKinesisWriter(config.kinesis_stream_name) 

# Flask App Resource Classes
class Ingestion(Resource):
    def post(self):
        try:
            data = json.dumps(request.data, ensure_ascii=False)

            kinesis_writer.send(data)
            return(response, 200)

        except Exception as e:
            abort(400, data=request.data, message=str(e))


# assign resources to paths
api.add_resource(Ingestion, '/log')

在所有关于该主题的搜索中,建议使用atexit。 atexit将应用于应用程序,然后将要求应用程序调用BufferedWriter类的_flush方法。这是我不希望使用的方法/细节,也不希望类的用户能够处理。该类应尽可能与应用程序分离。

我已经实现了atexit方法(Python和uWSGI),并尝试通过使用信号来捕获杀伤力。 因为我的Flask应用正在uwsgi服务器下运行,所以没有收到终止信号。
当我尝试atexit方法时,与Kinesis的连接已被断开。看起来好像已经在关闭Kinesis时进行了较早的清理,但我无法写入数据。

0 个答案:

没有答案