我有一个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时进行了较早的清理,但我无法写入数据。