TaskQueueでシーケンスに長時間処理したい場合って、チェインしてTaskを登録するんじゃなくStatus200-299以外の300とか返すだけでもいい気がするな。実行開始時にStatus=300を設定して、全部の処理が終了した時だけ200を返すとか。 #appengine
2010-06-11 01:45:05あーでもそれだと段々Taskの実行間隔が空いてしまうか。うーん。>200-299以外を返すことでTaskをチェイン #appengine
2010-06-11 01:46:42@shin1ogawa わたしはTQの処理を「if (isCompleted()) return OK; doProcess() + addChain(); setCompleted(true);」な感じで必ず組んでますね #appengine
2010-06-11 01:49:21@ashigeru setCompleted(true)した時にtrueの値はどこに保存しているカンジでしょうか?
2010-06-11 01:51:08僕は「if (isCompleted()) return OK; addChain(); doProcess(); setCompleted(true);」がいいかなぁと想像してるのですが。 #appengine
2010-06-11 01:51:14@shin1ogawa 基本的にデータストアに登録してます>completed。タスクにユニークなキーを渡す感じです
2010-06-11 01:54:42@ashigeru どこまで処理が終わったか?という情報(例えばKey)を格納する場合は、その値がnullかどうか、でも代用出来そうだけど、最後のaddChainが失敗することを考慮してcronが必要そうですね。 #appengine
2010-06-11 01:56:31ETAの設定が正しく働くなら、bufferingsさんの「先にaddChain、それに失敗したらエラー」が一番確実そうなんだけど、ETAを信用して良いかどうかが謎なんだよなぁw
2010-06-11 01:57:43@shin1ogawa ん?addChainが失敗するというのはTQに突っ込んだはずが例外も無く突っ込まれていなかったケースですか?
2010-06-11 01:58:03@ashigeru addChain()に失敗しつつ、DEEでaddChain()も間に合わないようなケースです。 #appengine
2010-06-11 01:58:38@bufferings 並列性をあげる場合には、入り口のタスクと実際に重くなるタスクを分けて作ってます。入り口のタスクでkeyOnlyしてサブタスクにばら撒くとか
2010-06-11 02:01:13addChainを後に書いていて失敗したら嫌だなぁと思ってたけど、それはエラーのリトライにするんですね。じゃ、何度やっても失敗する長さのタスク以外は大丈夫か。 #appengine
2010-06-11 02:03:47@shin1ogawa そです。さらにいえば、chainするタスクに連番キーを振ってcompletedを管理しておくと便利げです。
2010-06-11 02:03:55ちなみに目的の処理は「TaskQueueを使って全エンティティをシーケンスになめる&何にか処理する」という処理。カーソルで処理開始位置を保存して、DEEになるまえにTask終了、addChainか200系以外を返すことで続きを処理するTaskを走らせたい。 #appengine
2010-06-11 02:04:42@bufferings むしろチェインしてから失敗するとTQが爆裂するので、チェイン発行後はできるだけ失敗したくない感じです
2010-06-11 02:04:58@shin1ogawa そういう場合はチェインより多層タスクのほうが管理も並列化も楽だと思います。keys onlyで範囲だけ決める1層目と、キーを元に処理する2層目ですね #appengine
2010-06-11 02:06:301段目のタスク:実際にはカーソルで100件ずつくらい飛ばし飛ばしにKeyのブロックを取得して、その単位で2段目のタスクを投入。そのKeyのブロック単位の2段目のTaskはKeyを使って自身をリトライ。これをやろうとしてるかんじ。 #appengine
2010-06-11 02:07:15@ashigeru 並列実行可能なタスクの場合は入口でばら撒く。なるほどです。その場合タスク毎にcompletedを管理ですね。
2010-06-11 02:07:19