My Flask应用使用外部服务更新数据。结果存储在DB中(通过SQLAlchemy连接)。处理此问题的代码(更少)如下:
# if new results appear
# remove past results
db_session.query(MyModel.SimpleData).\
filter(MyModel.SimpleData.data_state == u'past').delete()
# present values become past
all_present_entries = db_session.query(MyModel.SimpleData).\
filter(MyModel.SimpleData.data_state == u'present').all()
for present_entry in all_present_entries:
present_entry.data_state = u'past'
# new values become present
for new_value in new_values:
db_session.add(MyModel.SimpleData(data_value=new_value,
data_state='present'))
# commit if everything is fine
db_session.commit()
db_session.close_all()
问题是应用程序没有通过压力测试。当有多个工作者(在Apache中)时,数据变得不一致。有时过去的数据为空,SQLAlchemy异常出现在日志中。可能的解决方案是在Apache的工作者中只运行一个更新功能实例。
如何实现这一目标? (设置全局标志,因此当时只有一个工作人员运行更新功能,因此其他工作人员不会覆盖数据)
编辑: 更具体一点 - 如果我有5个工作人员,并且在有多个请求的情况下,我希望更新功能仅由一个工作人员运行。目前(从日志中)我注意到每个工人都运行更新功能。之所以会发生这种情况,是因为我不知道如何指示(设置全局变量?)正在进行更新[由一名工人触发],因此其他工作人员不应该运行更新功能部分。