我正在尝试重构我的一些站点代码使用模块,无论我尝试什么,我似乎都无法让推送任务在我想要的地方执行。
这段app的基本结构是这样的……
- 用户将相当大且复杂的 XML 文件上传到默认模块上的处理程序
- 处理程序将文件放入 GCS 并为文件创建数据存储条目
- 该模型有一个 _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 (这是在尝试部署它时让我绊倒的事情)。