0

Я пишу веб-приложение через Google App Engine, и я хотел бы, чтобы сценарий часто обновлял профили пользователей на основе живой, временной информации, которую я получаю из фида XML. Я делаю это с GAE background_thread, поэтому сайт может продолжать работать, пока это выполняется.Доступ к хранилищу данных GAE из фоновой темы

Вне этой фоновой темы пользователи могут перемещаться по сайту и тем самым вносить изменения в свой профиль.

Фоновый поток выполняет именно то, что он должен, обновляя профили пользователей на основе живых данных XML и повторно вводить профиль в хранилище данных. Однако, когда пользователь вносит изменения в свой профиль, фоновый поток не набирает изменений. Возвращенный список из запроса datastore 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() 
+0

призвольным выполнения запроса (ваш фоновый поток выполнения запроса) подлежит возможная последовательность, если вы не выполняете запрос предка. В качестве второстепенных потоков в запросах на передний план действительно не покупают вас много. Если вы ожидаете IO, тогда просто используйте и асинхронный тасклет. Если ваш процессор привязан, то фоновый поток не улучшит ситуацию. Также поток не может прожить дольше, чем запрос. –

ответ

1

лишь некоторые случайные мысли, дон 'действительно знаю, что будет работать лучше всего (если вообще есть):

  1. Вместо того, чтобы делать profile.put() внутри цикла, возможно, вы могли сохранить измененные сущности в списке и выполнить некоторые вызовы ndb.put_multi() после цикла? Это уменьшило бы количество вызовов хранилища данных на количество объектов mUserStats, которые, таким образом, сократили время выполнения и оставляют меньше шансов на изменение профиля пользователем во время выполнения фоновой задачи.

  2. gprofiles = mUserStats.query() Если линия на самом деле получает целые объекты, может быть, вы могли бы попробовать сделать keys_only=True и получить каждый mUserStats объект индивидуально внутри цикла. Это увеличит время выполнения и количество вызовов хранилища данных на количество объектов mUserStats, но будет намного меньше шансов на то, что объект был изменен пользователем в течение времени, когда он был выбран фоновой задачей.

  3. Сохранено (а) недвижимость обновляется ли XML-страница теми же свойствами, обновляемыми пользователем? Если нет - возможно, они могут храниться в разных моделях.

Вы также можете взглянуть на query «s cursors и iterators, которые могут быть полезны для автоматизации предложения 1 & 2.

Смежные вопросы