(Google AppEngine) Memcache Lock Entry - PullRequest
       8

(Google AppEngine) Memcache Lock Entry

1 голос
/ 11 февраля 2010

Мне нужна блокировка в memcache. Поскольку все операции являются атомарными, это должно быть легкой задачей. Моя идея заключается в использовании базового механизма спин-блокировки. Таким образом, каждый объект, который нуждается в блокировке в memcache, получает объект блокировки, который будет опрошен для доступа.

// pseudo code
// try to get a lock
int lock;
do
{
  lock = Memcache.increment("lock", 1);
}
while(lock != 1)

// ok we got the lock
// do something here

// and finally unlock
Memcache.put("lock", 0);

Как работает такое решение? У вас есть идея, как заблокировать объект memcache?

С уважением,

Фридрих Шик

Ответы [ 4 ]

4 голосов
/ 11 февраля 2010

Будь осторожен. В этом цикле вы могли бы прожечь большую часть вашей квоты .

2 голосов
/ 12 февраля 2010

Блокировка, как правило, плохая идея, и в вашем примере это приведет к циклу ожидания ожидания, который потребляет огромные квоты.

Для чего вам нужен замок? Возможно, мы можем предложить лучшую альтернативу.

1 голос
/ 03 марта 2010

Если вам действительно нужен цикл: не занимайте время ожидания, а включите задержку, возможно, с экспоненциальным откатом:

int delay = 100;
do {
    lock = Memcache.increment("lock", 1);
    usleep(delay);
    delay = min(delay * 2, 100000);
}
while (!lock);
0 голосов
/ 28 октября 2010

Как вы сказали, все операции с memcache являются атомарными. Чтобы повторять ответы других, не используйте наивную спин-блокировку на движке приложения. Вы будете использовать свою дневную квоту примерно через 20 минут. Теперь к вашему решению:

Я сделал что-то вроде этого. Я создал очередь задач с размером сегмента 1 и скоростью выполнения 1/10 с (одна задача в 10 секунд). Я использовал эту очередь для «вращения», за исключением того, что она имеет преимущество проверки только один раз в 10 секунд. Я не уверен, каков ваш вариант использования, но даже выполнение задачи один раз в секунду намного лучше, чем просто вращение в цикле. Таким образом, вы реализуете сервлет задачи, который проверяет состояние этой блокировки и, если она свободна, делает все, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...