Как я могу асинхронно запрашивать API поиска GCP из экземпляра App Engine? - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужно выполнить поиск в своих индексированных документах App Engine с помощью API поиска. Насколько я могу судить, на API поиска можно ссылаться только на API google.appengine для стандартной среды.

Моя проблема в том, что некоторое увлажнение, промывка и запросы занимают более 60 секунд. Мне нужно вернуть ответ от движка приложения, продолжить обработку запроса в фоновом режиме, а затем опубликовать результаты в Pub / Sub. Тем не менее, я могу порождать потоки или использовать background_thread в стандартной среде. Я бы переключился на гибкую среду, но я не могу использовать библиотеку API поиска Python.

Является ли мой единственный вариант переключения на среду Flex и использование API-интерфейсов REST?

1 Ответ

0 голосов
/ 13 ноября 2018

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

Например,

1. Настройка новой службы для обработки задачи (ДОПОЛНИТЕЛЬНО)

Установите вызов yaml newtaskworker.yaml, который похож на ваш app.yaml, так как вы можете захотеть, чтобы другая служба выполняла задачу, а не оригинальную.

Единственное отличие - не забывайте добавлять для него имя службы, service: newtaskworker

Не забудьте развернуть его по gcloud app deploy newtaskworker.yaml

2. Установить очередь

Чтение Как создать новую очередь , вообще говоря, вам нужно queue.yaml для постановки в очередь задач. Не забудьте развернуть его по gcloud app deploy queue.yaml

queue:
- name: queue_name
  rate: 20/s #You may limit the speed of *START* new task here
  bucket_size: 40
  max_concurrent_requests: 10 #This is limited by your max_instances allowed in newtaskworker.yaml, you may simply omit it

3. Наконец твой код

from google.appengine.api import taskqueue

#/deleteTask
class DeleteTask(webapp2.RequestHandler):
    def get(self):
        paramA      = self.request.get('paramA')
        paramB      = self.request.get('paramB')
        #your Search delete here

class GetPostDataTask(webapp2.RequestHandler):
    def get(self):   
        #If you don't want to use a new service, simply use 'default` in target.
        #Your Go to Pub/Sub work here.
        taskqueue.add(queue_name='queue_name', url='/deleteTask', method='GET', params={'paramA': 1, 'paramB': 2}, target='newtaskworker')

Если все в порядке, вы можете найти свою задачу в Консоли -> Инструменты -> Облачная задача

...