【发布时间】: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