从后台线程访问GAE数据存储

2024-03-29 13:00:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过googleappengine编写一个web应用程序,我希望有一个脚本能够根据从XML提要获得的实时、临时信息来频繁地更新用户配置文件。我用一个GAE后台线程来执行这个操作,这样站点可以在运行时继续运行。你知道吗

在这个后台线程之外,用户仍然可以浏览网站,从而更改他们的个人资料。你知道吗

后台线程做它应该做的事情,根据活动的XML数据更新用户配置文件,并将配置文件重新输入到数据存储中。但是,当用户对其配置文件进行更改时,后台线程不会注意到这些更改。ndb数据存储查询返回的列表不反映用户所做的更改。你知道吗

奇怪的是,如果一个新用户被添加到数据存储中,它确实反映了正确的更改,但是如果一个先前存在的用户配置文件被修改,它就不会反映更改。我应该能够从后台线程查询/放置数据存储对吗?你知道吗

背景线的肉:

def update_accounts():
    while True:
        # Get data from XML feed.
        info_dict = get_live_data()

        # Get all the users from the GAE database
        gprofiles = mUserStats.query()

            for profile in gprofiles:

                # This isn't the actual condition but there's a condition here.
                if needs_update in profile.m_needsUpdate: 

                    # Modify the current profile. 
                    profile.make_change(info_dict)
                    # Re enter into database.
                    profile.put()

        # Add a sleep time as this doesn't need to run that frequently.
        time.sleep(20)              

类updateAccounts():

def start_thread(self):
    t =background_thread.start_new_background_thread(target=update_accounts())

这是修改配置文件的地方:

def post(self):
        session = get_current_session()
        user_key = mUserStats_key(session['me'].m_email)
        curr_user = mUserStats.get_by_id(session['me'].m_email, user_key)
        curr_user.change_profile() 
        curr_user.put()

Tags: the数据用户getsessiondef配置文件update
1条回答
网友
1楼 · 发布于 2024-03-29 13:00:39

只是一些随意的想法,不知道哪种方法最有效(如果有的话):

  1. 与其在循环内执行profile.put(),不如将更改的实体存储在列表中,并在循环后执行一些ndb.put_multi()调用?这将使数据存储调用的数量减少mUserStats实体的数量,从而减少执行时间,并减少在后台任务运行时用户更改配置文件的机会。

  2. 如果gprofiles = mUserStats.query()行实际获取整个实体,那么您可以尝试执行keys_only=True,并在循环中分别获取每个mUserStats实体。这将通过mUserStats实体的数量来增加执行时间和数据存储调用的数量,但是在后台任务获取实体的过程中,用户更改实体的可能性将大大降低。

  3. XML提要更新的属性是否与用户更新的属性相同?如果没有-也许它们可以存储在不同的模型中。

您还可以查看querycursorsiterators,这可能有助于自动化建议1和建议2。你知道吗

相关问题 更多 >