0

Google App Engine を使用して Web アプリケーションを作成しています。XML フィードから取得したライブの一時的な情報に基づいて、スクリプトでユーザー プロファイルを頻繁に更新したいと考えています。GAE background_thread を使用してこれを行っているため、これが実行されている間もサイトが動作し続けることができます。

このバックグラウンド スレッドの外でも、ユーザーは Web サイトをナビゲートして、プロファイルを変更できます。

バックグラウンド スレッドは、ライブ 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()
4

1 に答える 1

1

いくつかのランダムな考えですが、どれが最も効果的かはわかりません(もしあれば):

  1. ループ内で行う代わりに、profile.put()変更されたエンティティをリストに保存しndb.put_multi()、ループ後にいくつかの呼び出しを行うことができますか? これにより、エンティティの数だけデータストア呼び出しの数がmUserStats減るため、実行時間が短縮され、バックグラウンド タスクの実行中にユーザーがプロファイルを変更する可能性が少なくなります。

  2. gprofiles = mUserStats.query()行が実際にエンティティ全体をフェッチする場合は、ループ内でkeys_only=True各エンティティを個別に取得してみてください。mUserStatsこれにより、実行時間とデータストア呼び出しの数がmUserStatsエンティティの数だけ増加しますが、エンティティがバックグラウンド タスクによってフェッチされている間にユーザーによってエンティティが変更される可能性ははるかに低くなります。

  3. XML フィードによって更新されるプロパティは、ユーザーによって更新されるプロパティと同じですか? そうでない場合は、別のモデルに格納される可能性があります。

また、提案 1 と 2 を自動化するのに役立つ可能性があるqueryカーソルイテレータを確認することもできます。

于 2015-02-04T09:36:26.900 に答える