应用程序引擎任务不在已定义的目标中执行

时间:2015-01-12 21:56:08

标签: google-app-engine google-app-engine-python

我试图重构我的一些网站代码使用模块,无论我尝试什么,我似乎无法在我想要的地方执行推送任务。

这款应用程序的基本结构就是这样......

  1. 用户将相当大且复杂的XML文件上载到默认模块
  2. 上的处理程序
  3. 处理程序将文件放入GCS并为文件
  4. 创建数据存储条目
  5. 该模型有一个_post_put_hook,可以创建两个任务队列作业,对这个XML文件进行一些处理。
  6. 我希望两个任务队列作业在一个大于F1的实例中执行,因为我已经碰到了128MB的软内存限制,我希望这些作业执行得更快一点。

    所以我创建了一个dispatch.yaml文件(我还不太确定这个文件是否需要),就像这样......

    application: myapp
    dispatch:
    - url: "*/tasks/.*"
      module: tasks
    

    还有像这样的tasks.yaml ......

    application: myapp
    module: tasks
    version: 1
    runtime: python27
    api_version: 1
    threadsafe: true
    
    instance_class: F2
    
    handlers:
      - url: /.*
      script: tasks.app
      login: admin
    
    libraries:
    - name: lxml
      version: "2.3"
    - name: ssl
      version: "latest"
    

    最后,将工作排队的post_put_hook看起来像这样......

    def _post_put_hook(self, future):
        if self.identification is None:
            taskqueue.add(url='/tasks/extraction', params={'key': self.key.id()}, target="tasks", name="extractor-%s" % self.key.id())
            taskqueue.add(url='/tasks/indexer', params={'key': self.key.id()}, target="tasks", name="indexer-%s" % self.key.id()))
    

    我的理解是因为我在taskqueue()调用中指定了一个目标,它应该使用该模块,但事实并非如此。我已经尝试使用和不使用dispatch.yaml文件部署到应用程序引擎,它似乎没有区别任务执行的位置。应用程序引擎开发控制台似乎承认有一个任务模块,因为它提供了一个过滤我的日志和实例列表的选项。

    我应该补充一点,我通过CLI部署了应用程序,确保同时指定我的app.yaml和tasks.yaml(在尝试部署它时,这会让我感到沮丧)。

2 个答案:

答案 0 :(得分:0)

尝试更改

- url: "*/tasks/.*"

- url: "*/tasks/*"

答案 1 :(得分:0)

好的,我发现了问题所在。

我原以为在使用dispatch.yaml时,“sub”模块(我的'tasks'模块)被安装回相应模块的基本URL('/ *')。通过查看此处提供的示例https://github.com/GoogleCloudPlatform/appengine-modules-helloworld-python,我看到了

,从而产生了这种信念
- url: "*/mobile/*"
  module: mobile-frontend
dispatch.yaml

中的

handlers:
- url: /.*
  script: printenv.APP

在mobile_frontend.yaml

和printenv.py将应用程序安装为......

APP = webapp2.WSGIApplication([
    ('/.*', MainHandler)
], debug=True)

我仍然不太确定上面的代码是如何工作的,因为为了我的代码工作,我必须进行Dave上面提到的调整并且......

将我的tasks.yaml改为

handlers:
- url: /tasks/.*
  script: tasks.app
  login: admin

并将tasks.py中的路由更改为......

ROUTES = (webapp2.Route('/tasks/extraction', ExtractionWorker),
          webapp2.Route('/tasks/indexer', IndexingWorker))
之前他们看起来像

ROUTES = (webapp2.Route('/extraction', ExtractionWorker),
          webapp2.Route('/indexer', IndexingWorker))