0

我正在通过 Google App Engine 编写一个网络应用程序,我希望有一个脚本根据我从 XML 提要获得的实时临时信息频繁更新用户配置文件。我正在使用 GAE background_thread 执行此操作,因此该站点可以在运行时继续运行。

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

后台线程完全按照它应该做的事情,根据实时 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)              

类更新帐户():

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()
4

1 回答 1

1

只是一些随机的想法,真的不知道哪个最有效(如果有的话):

  1. 而不是profile.put()在循环内进行,也许您可​​以将更改的实体存储在列表中并在循环后进行一些ndb.put_multi()调用?这将通过您拥有的实体数量减少数据存储调用的数量,mUserStats从而减少执行时间,并减少用户在后台任务运行时更改配置文件的机会。

  2. 如果该gprofiles = mUserStats.query()行实际上获取了整个实体,也许您可​​以尝试在循环中单独keys_only=True获取每个实体。mUserStats这将增加实体数量的执行时间和数据存储调用次数,mUserStats但在后台任务获取实体期间,用户更改实体的机会将大大减少。

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

您还可以查看query游标迭代器,这可能有助于自动化建议 1 和 2。

于 2015-02-04T09:36:26.900 回答