Я пытаюсь выполнить некоторую задачу в очереди отложенных задач, и мне нужно выполнить другую задачу при успешном завершении задачи в отложенной очереди. Скажем, например, мне нужно удалить все файлы, хранящиеся по заданному пути, а затем, после успешного удаления всех файлов, я хочу снова начать создавать файлы.Отложенная очередь в Google App Engine
Ниже приведен пример кода того, как я пытаюсь его достичь в настоящее время. К сожалению, это вызывает следующее исключение:
raise PermanentTaskFailure(e) PermanentTaskFailure: 'module' object has no attribute '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 в очередь –