ゴルーチンは Google App Engine のスタンダード環境で効果的に利用できますか?これについてさらに詳しく見てみましょう。
次のコード例を考えてみましょう:
<code class="go">func MyHandler(w http.ResponseWriter, r *http.Request) { go func() { // do something ... }() return // 200 }</code>
このコード スニペットは正しく機能しているように見えますが、実際は機能しません。リクエストの存続期間を超えて存続するゴルーチンは推奨されないことに注意することが重要です。これは、Google App Engine のスタンダード環境がゴルーチンの並列実行をサポートしていないためです。したがって、リクエストを超えて存続するゴルーチンは予期しない動作を引き起こす可能性があるため、推奨されません。
代わりに、 runtime.RunInBackground 関数を利用してコードの実行を開始できます。バックグラウンドのゴルーチン内:
<code class="go">func MyHandler(w http.ResponseWriter, r *http.Request) { err := runtime.RunInBackground(c, func(c appengine.Context) { // do something... }) return // 200 }</code>
runtime.RunInBackground を使用すると、専用のバックグラウンド コンテキストを使用してバックグラウンドのゴルーチンで実行される関数を提供します。このアプローチにより、バックグラウンド処理が現在のリクエストのコンテキストに干渉しないことが保証され、App Engine のスタンダード環境でバックグラウンド タスクを実行する場合に推奨される方法です。ただし、インスタンスのリソースに過大な負荷がかかるのを防ぐために、インスタンスあたりのバックグラウンド リクエストの同時実行数は 10 個に制限されていることに注意してください。
リクエストを超えて存続するゴルーチンはサポートされていません。 、リクエストのコンテキスト内で動作するゴルーチンは、App Engine のスタンダード環境で完全にサポートされています。
The Go runtime environment for App Engine provides full support for goroutines, but not for parallel execution: goroutines are scheduled onto a single operating system thread. This single-thread restriction may be lifted in future versions. Multiple requests may be handled concurrently by a given instance; that means that if one request is, say, waiting for a datastore API call, another request may be processed by the same instance. (Source)
したがって、リクエストのコンテキスト内の有効期間の短いゴルーチンは、並列処理、同期、その他のタスクに効果的に使用できます。アプリケーションのパフォーマンスや安定性が損なわれます。
以上がGoroutines は Google App Engine のスタンダード環境で効果的に使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。