python:Flask:处理Apache的工作者/全局变量?

时间:2015-10-12 11:11:15

标签: python flask flask-sqlalchemy

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个工作人员,并且在有多个请求的情况下,我希望更新功能仅由一个工作人员运行。目前(从日志中)我注意到每个工人都运行更新功能。之所以会发生这种情况,是因为我不知道如何指示(设置全局变量?)正在进行更新[由一名工人触发],因此其他工作人员不应该运行更新功能部分。

0 个答案:

没有答案