Google App Engine deferred.defer задача не выполняется - PullRequest
1 голос
/ 16 апреля 2020

У меня есть приложение стандартной среды Google App Engine, которое работает нормально в течение года или более, которое внезапно отказывается ставить новые отложенные задачи в очередь с помощью deferred.defer.

Вот Python 2.7 код, который выполняет отложенный вызов:

# Find any inventory items that reference the product, and change them too.
# because this could take some time, we'll do it as a deferred task, and only
# if needed.
if upd:
    updater = deferredtasks.InvUpdate()
    deferred.defer(updater.run, product_key)

В моем файле app.yaml есть необходимые биты для поддержки deferred.defer:

- url: /_ah/queue/deferred
  script: google.appengine.ext.deferred.deferred.application
  login: admin

builtins:
- deferred: on

И в моей отложенной задаче есть вход в систему поэтому я должен видеть, что он работает, когда он делает:

#-------------------------------------------------------------------------------
# DEFERRED routine that updates the inventory items for a particular product.  Should be callecd
# when ANY changes are made to the product, because it should trigger a re-download of the
# inventory record for that product to the iPad.
#-------------------------------------------------------------------------------
class InvUpdate(object):
    def __init__(self):
        self.to_put = []
        self.product_key = None
        self.updcount = 0

    def run(self, product_key, batch_size=100):
        updproduct = product_key.get()
        if not updproduct:
            logging.error("DEFERRED ERROR:  Product key passed in does not exist")
            return

        logging.info(u"DEFERRED BEGIN: beginning inventory update for: {}".format(updproduct.name))
        self.product_key = product_key
        self._continue(None, batch_size)
        ...

Когда я запускаю это в среде разработки на моем компьютере для разработки, все работает нормально. После развертывания его на сервере App Engine обновления инвентаризации никогда не выполняются (т. Е. Отложенная задача не выполняется), и в файлах журналов на сервере нет ошибок (и фактически нет других операций регистрации из отложенной задачи). , Я знаю, что с внезапным движением, чтобы все набрали Python 3 как можно быстрее, библиотека deferred.defer была помечена как не рекомендуемая, потому что она работает только со средой 2.7 Python, и я планировал перейти к задаче очереди для этого, но я не ожидал, что deferred.defer внезапно перестанет работать в существующей среде python.

Любое понимание будет с благодарностью!

1 Ответ

2 голосов
/ 17 апреля 2020

Я почти уверен, что вы не можете передать метод экземпляра в appengine taskqueue, потому что этот экземпляр не будет существовать при выполнении вашей задачи, так как он будет выполняться в другом процессе. Я на самом деле не понимаю, как ваша задача когда-либо работала при удаленном запуске (и локальный запуск не является точным представлением того, как все будет работать удаленно)

Попробуйте изменить свой код следующим образом:

if upd:
    deferred.defer(deferredtasks.InvUpdate.run_cls, product_key)

, а затем InvUpdate - то же самое, но с новой функцией run_cls:

class InvUpdate(object):
    @classmethod
    def run_cls(cls, product_key):
        cls().run(product_key)

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

...