0

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

这段app的基本结构是这样的……

  1. 用户将相当大且复杂的 XML 文件上传到默认模块上的处理程序
  2. 处理程序将文件放入 GCS 并为文件创建数据存储条目
  3. 该模型有一个 _post_put_hook,它创建两个任务队列作业,对这个 XML 文件进行一些处理。

我希望这两个任务队列作业在大于 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 (这是在尝试部署它时让我绊倒的事情)。

4

2 回答 2

0

尝试改变

- url: "*/tasks/.*"

- url: "*/tasks/*"
于 2015-01-13T05:45:51.187 回答
0

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

我曾认为,当使用 dispatch.yaml 时,“子”模块(我的“任务”模块)被安装回相应模块的基本 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))
于 2015-01-13T17:04:07.577 回答