我试图重构我的一些网站代码使用模块,无论我尝试什么,我似乎无法在我想要的地方执行推送任务。
这款应用程序的基本结构就是这样......
我希望两个任务队列作业在一个大于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(在尝试部署它时,这会让我感到沮丧)。
答案 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))