Я пишу веб-приложение через 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()
призвольным выполнения запроса (ваш фоновый поток выполнения запроса) подлежит возможная последовательность, если вы не выполняете запрос предка. В качестве второстепенных потоков в запросах на передний план действительно не покупают вас много. Если вы ожидаете IO, тогда просто используйте и асинхронный тасклет. Если ваш процессор привязан, то фоновый поток не улучшит ситуацию. Также поток не может прожить дольше, чем запрос. –