【问题标题】:Deferred Queue in Google App EngineGoogle App Engine 中的延迟队列
【发布时间】:2017-04-29 12:00:29
【问题描述】:

我正在尝试在延迟任务队列中执行一些任务,并且我需要在延迟队列中的任务成功完成后执行另一个任务。例如,我需要删除存储在给定路径中的所有文件,然后在成功删除所有文件后,我想再次开始创建文件。

下面是我目前尝试实现它的示例代码。不幸的是,它引发了以下异常:

引发 PermanentTaskFailure(e) PermanentTaskFailure:“模块”对象没有属性“DeleteTitanFiles”

删除延迟队列中的文件后要执行的另一个任务不一定是另一个任务,它可以是任何东西,甚至是简单的打印语句。关键是,执行删除后,控件应该返回到下一条语句。

from google.appengine.ext import ndb
from google3.apphosting.contrib.titan.files import files
from google.appengine.ext import deferred
import logging

TITAN_FILES_PATH = '/lovish-abc/'

BATCH_SIZE = 250

range_titan = 0

def _GetFileCount():
    return files.Files.count(TITAN_FILES_PATH, recursive=True)

file_count = _GetFileCount()

print _GetFileCount()

def CreateTitanFiles(path, start):
    logging.warning('In the CreateTitanFiles method')
    filecount = _GetFileCount()
    if filecount < 1000:
        range_titan = start + BATCH_SIZE
        for z in xrange(start, range_titan):
            titan_files = files.File(TITAN_FILES_PATH + 'file' + str(z) + '.json')
            titan_files.write(content='adasdad')
        logging.info("######sdgdgds")
        deferred.defer(
            CreateTitanFiles, TITAN_FILES_PATH, range_titan)



def DeleteTitanFiles(path):
    logging.info('In the DeleteTitanFiles method')

    filecount = _GetFileCount()

    if filecount > 0:
        titan_files = files.Files.list(
            TITAN_FILES_PATH, limit=BATCH_SIZE)
        titan_files.delete()
    else:
        CreateTitanFiles(TITAN_FILES_PATH, 0)


def CallDeleteTitanFiles(path):
    logging.warning('In the CallDeleteTitanFiles method')

    filecount = _GetFileCount()

    while filecount > 0:
        try:
            deferred.defer(DeleteTitanFiles, TITAN_FILES_PATH)
            filecount = _GetFileCount()
            logging.info('calling again')
            print filecount
        except Exception, e:
            raise e

CallDeleteTitanFiles(TITAN_FILES_PATH)

有什么建议可以达到预期的效果吗?

【问题讨论】:

  • 你为什么在模块级别调用CallDeleteTitanFiles?这将在第一次导入模块时执行,这肯定不是您想要的。
  • 我试图在交互式控制台上执行此操作,因此必须提供一个入口点 CallDeleteTitanFiles(TITAN_FILES_PATH) 只需将 DeleteTitanFiles 方法放入队列中

标签: python google-app-engine deferred task-queue


【解决方案1】:

Limitations of the deferred library 的此注释可能与您收到该错误的原因有关:

  • 您不能传递请求处理程序模块中定义的方法。

上面最后一点值得特别注意:传递一个方法 在请求处理程序模块中定义 - 指定为 app.yaml 中的请求处理程序 - 将不起作用。你可以打电话 deferred.defer 来自请求处理程序模块,但是你的函数 传递给它必须在别处定义!

要在交互式控制台中执行代码,您不需要在模块中实例化调用。

假设您的模块名为 my_module.py,您可以在控制台中调用 CallDeleteTitanFiles(),如下所示:

from my_module import CallDeleteTitanFiles, TITAN_FILES_PATH
CallDeleteTitanFiles(TITAN_FILES_PATH)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 2012-02-21
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多