0
func init() {
    http.HandleFunc("/", handler)
}

ハンドラー関数には、データのリストを反復処理し、処理し、結果を集計するコードがあります。

特定のクエリで、処理する必要があるアイテムが 100 個あるとします。アイテムごとに、「アイテム n は処理されました」というログを Appengine コンソールに書き込みます。

問題は次のとおりです。

リクエストは返されません。最初の 40 程度の項目のログ メッセージが表示され、それが繰り返されます。常に同じアイテムで停止し、再起動します。

私の推測では、アプリがメモリ制限か何かに達しており、Appengine Go ランタイムが再起動し、ハンドラーを再実行していると思われます。

アイテムの小さなリストの場合、処理は期待どおりに進み、ログにはループが表示されません。

リクエスト ログにエラーはありませんが、別のログには次のように表示されます。

panic: poll_ctl

goroutine 3 [running]:
runtime/eventloop.(*pollServer).ctlfd(0x9035f8, 0x204100000005, 0x3, 0x2041, 0x0, ...)
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:428 +0xdf
runtime/eventloop.(*pollServer).loop(0x9035f8, 0x0)
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:411 +0x4d8
created by runtime/eventloop.init·1
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:232 +0x40

goroutine 1 [select (no cases)]:
appengine_internal/fd_transport.serveHTTP(0x7fff76502f58, 0x70615f2f00000002, 0x7fff76502f5b, 0x3, 0x7fff76502f6c, ...)
    go/src/pkg/appengine_internal/fd_transport/fd_transport.go:44 +0x26b
appengine_internal.Main()
    go/src/pkg/appengine_internal/internal.go:184 +0x1a8
main.main()
    _go_main.go:16 +0x18

goroutine 2 [select]:
created by _
    _.go:568 +0xd2

goroutine 10 [chan receive]:
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf840095a60, 0xf84011ac30, 0xb, 0x1, ...)
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7
runtime/eventloop.(*FD).ReadFrom(0xf840095a50, 0xf840138000, 0x7d0000007d0, 0xf800000000, 0x0, ...)
    go/src/pkg/runtime/eventloop/fd.go:135 +0x1c2
created by _
    _.go:144 +0x7a

goroutine 5 [chan receive]:
created by _
    _.go:461 +0x3ca

goroutine 6 [semacquire]:
sync.runtime_Semacquire(0xf8408034d8, 0xf8408034d8)
    go/src/pkg/runtime/zsema_amd64.c:146 +0x25
sync.(*Cond).Wait(0xf840096bb0, 0x1)
    go/src/pkg/sync/cond.go:67 +0xaa
created by _
    _.go:462 +0x3e1

goroutine 7 [chan receive]:
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf840095c70, 0xf84011ac30, 0xb, 0x1, ...)
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7
runtime/eventloop.(*FD).Read(0xf840095c60, 0xf84113a000, 0x972a80000000c, 0x2b5800000000, 0xf84011ac30, ...)
    go/src/pkg/runtime/eventloop/fd.go:93 +0x18c
io.ReadAtLeast(0xf84012c0c0, 0xf840095c60, 0xf84113a000, 0x972a80000000c, 0x2b580000000c, ...)
    go/src/pkg/io/io.go:254 +0xc3
io.ReadFull(0xf84012c0c0, 0xf840095c60, 0xf84113a000, 0x972a80000000c, 0xf840095c60, ...)
    go/src/pkg/io/io.go:273 +0x69
created by _
    _.go:845 +0x2c6

goroutine 11 [runnable]:
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf840095b10, 0xf84011ac30, 0xb, 0x1, ...)
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7
runtime/eventloop.(*FD).Accept(0xf840095b00, 0x0, 0x0, 0xf84011ac30, 0xb, ...)
    go/src/pkg/runtime/eventloop/fd.go:72 +0x185
net/http.(*Server).Serve(0xf840129f00, 0xf8400cfa80, 0xf840095b00, 0x0, 0x0, ...)
    go/src/pkg/net/http/server.go:1012 +0x88
net/http.Serve(0xf8400cfa80, 0xf840095b00, 0xf84012c090, 0xf8400e0b10, 0xf8400e0b10, ...)
    go/src/pkg/net/http/server.go:977 +0x71
created by _
    _.go:145 +0xe9

goroutine 12 [timer goroutine (idle)]:
created by addtimer
    go/src/pkg/runtime/ztime_amd64.c:70

goroutine 13 [runnable]:
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf8400959b0, 0xf84011ac30, 0xb, 0x1, ...)
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7
runtime/eventloop.(*FD).Read(0xf8400959a0, 0xf840139000, 0x100000001000, 0x0, 0xf84011ac30, ...)
    go/src/pkg/runtime/eventloop/fd.go:93 +0x18c
io.(*LimitedReader).Read(0xf840123580, 0xf840139000, 0x100000001000, 0xf8900000000, 0x0, ...)
    go/src/pkg/io/io.go:394 +0xc1
bufio.(*Reader).fill(0xf840129f80, 0x2b5853e92000)
    go/src/pkg/bufio/bufio.go:77 +0xf0
bufio.(*Reader).Read(0xf840129f80, 0xf84013d000, 0x27100000000c, 0xc, 0x0, ...)
    go/src/pkg/bufio/bufio.go:142 +0x188
io.ReadAtLeast(0xf84012c600, 0xf84012c570, 0xf84013d000, 0x27100000000c, 0xc, ...)
    go/src/pkg/io/io.go:254 +0xc3
io.ReadFull(0xf84012c600, 0xf84012c570, 0xf84013d000, 0x27100000000c, 0xf84012c570, ...)
    go/src/pkg/io/io.go:273 +0x69
net/http.(*conn).serve(0xf8401320c0, 0x0)
    go/src/pkg/net/http/server.go:656 +0x621
created by net/http.(*Server).Serve
    go/src/pkg/net/http/server.go:1040 +0x430

goroutine 59 [sleep]:
time.Sleep(0x5dfdee1, 0xf8408034d0)
    go/src/pkg/runtime/ztime_amd64.c:22 +0x49
created by _
    _.go:791 +0xc4

goroutine 15 [chan receive]:

すべてのエラーをログに記録しているわけではないかもしれませんが、ループの原因は何ですか?

更新 ほぼ無限のループにより、データストアの書き込みクォータがすぐに使い果たされました。現在、ログに記録されている引用符なしのエラーが発生しています。エラーがログに記録された後、ハンドラーが再度呼び出されます。そしてまた....

func handleError(w http.ResponseWriter, c appengine.Context, err error) {
    c.Infof("ERROR")
    c.Errorf("ERROR datastore: %s", err.Error())
}


...
rk, err := datastore.Put(c, rk, e)
if err != nil {
    handleError(w, c, err)
    return
}

更新 2 f4 インスタンスに切り替えた後、コードは期待どおりに実行されます。Appengine Go ランタイムがなんらかの理由 (メモリ) でサイレントに失敗し、ハンドラーの実行を再開していると思います。それは私の最善の推測です、私にはわかりません。

4

1 に答える 1

1

http リクエストには 30 秒のタイムアウトがあります。より高速なインスタンスに移行する前に、プロセスにそれほど時間がかかりましたか? バックエンド プロセスを使用して、長期間の処理を行うことができます。 https://developers.google.com/appengine/docs/go/backends/overview

于 2012-04-19T05:25:29.740 に答える