Я работаю над счетчиком для приложения App Engine и следую приведенному здесь примеру http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding
У меня проблемы с пониманием необходимости в следующих строках:
counter = cls.get_by_key_name(name)
if not counter:
counter = cls()
Похоже, что для экземпляра был запрошен инкремент, и затем, когда этот инкремент должен был быть применен к хранилищу данных, экземпляр не был найден и был заменен новым.
Тот же шаблон используется в примере с счетчиками шардинга code.google.com/appengine/articles/sharding_counters.html
counter = SimpleCounterShard.get_by_key_name(shard_name)
if counter is None:
counter = SimpleCounterShard(key_name=shard_name)
В этом случае имя_ключа согласуется между тем, которое не было найдено, и тем, которое создано, поэтому, когда в конечном счете вызывается counter.put (), кажется, что новый перезапишет не найденный.
Мое использование похоже на этот пример, который основан на первом примере выше: https://github.com/pamelafox/ragetube/blob/master/models.py
Я читаю строку 66 как «песня была просмотрена, и пришло время обновить ее количество просмотров. Выберите песню, но если вы не можете, создайте новую песню и дайте ей это количество» , Это не может быть правдой.
Почему get_by_key_name () не может вернуть запись? Есть ли какое-то поведение по умолчанию, которое заставляет работать первый пример (т. Е. Следует ли указывать какое-либо имя ключа)? В какой ситуации я могу оказаться, если просто вернусь из функции, если экземпляр не найден?