Является ли lease_tasks() в очереди gae pull методом блокировки?

У меня есть очередь запросов в Google App Engine и резидентный бэкэнд, который обрабатывает задачи в очереди запросов. В бэкэнде есть несколько рабочих потоков для выполнения задач и их обработки, как это предлагается в публикации в блоге Google Cloud Platform.

https://cloud.google.com/resources/articles/ios-push-notifications

Рабочие опрашивают пул-очередь с lease_tasks(). Мой вопрос: является ли lease_tasks () методом блокировки, т.е. блокировать выполнение текущего потока до тех пор, пока в очереди не будет выполнено несколько задач или не будет превышен конечный срок?

Согласно документации GAE

https://developers.google.com/appengine/docs/python/taskqueue/overview-pull

lease_tasks () принимает параметр 'deadline' и может вызывать DeadlineExceededError, поэтому не рационально предполагать, что lease_tasks () блокирует до 'deadline' секунд?

Проблема заключается в том, что, пока я занимаюсь разработкой приложения на сервере разработки, lease_tasks() немедленно возвращается с пустым списком задач. В результате цикл while рабочего потока постоянно вызывает lease_tasks(), что потребляет 100% ресурсов ЦП. Если я поставлю явный сон (), скажем, на 5 секунд, это заставит работника заснуть и не проснется, если задача будет помещена в очередь в то же время. Это сделало бы работника менее отзывчивым (в худшем случае это может занять ->5 секунд для обработки следующей задачи), плюс я бы потреблял больше ресурсов ЦП (пробуждение -> циклы сна), чем просто наличие блока потока в "очереди" (Я знаю, что очередь на самом деле является RPC, но абстрактно она остается в очереди производителей)

Возможно, это происходит только с сервером приложений dev, в то время как в блоках GAE lease_tasks(). Однако пример кода из поста блога, упомянутого выше, также приостанавливает выполнение потока с помощью sleep(). Пример кода доступен в github, а ссылка есть в сообщении в блоге (к сожалению, я не могу опубликовать его здесь)

1 ответ

lease_tasks не ждет добавления новых задач. Большинство вызовов очереди задач занимают до 5 секунд. Вызовы для аренды заданий и получения статистики очереди занимают больше времени - по умолчанию до 10 секунд.

Большинству пользователей не нужно устанавливать крайний срок, это необязательный параметр. Если у вас очень много работников, участвующих в одной и той же очереди, и через 10 секунд часто возникают временные ошибки, рассмотрите возможность увеличения срока аренды до 20 секунд (или рассредоточьте нагрузку по нескольким очередям и / или тегам). С другой стороны, если у вас есть только один работник, и ему всегда требуется время для выполнения других работ, помимо лизинговых задач, можно использовать небольшой срок, например 5 секунд, но вместо этого гораздо лучше использовать асинхронный API.

Другие вопросы по тегам