6

Python/Java の非同期データストア API に類似した Go はありますか? それとも、goキーワードで通常の API を使用できますか?

4

2 に答える 2

13

AppEngineサービスにはPythonまたはJava非同期APIに相当するGoはありません。実際、Go標準ライブラリには、標準の非同期スタイルでも何もありません。その理由は、Goでは、ブロッキングスタイルを使用して関数を記述し、必要に応じていくつかの基本的な同時実行プリミティブを使用して関数を作成するためです。go通話の開始時にタックすることはできませんがdastore.Get、それでも比較的簡単です。次の不自然な例を考えてみましょう。

func loadUser(ctx appengine.Context, name strings) (*User, err) {
  var u User
  var entries []*Entry
  done := make(chan error)

  go func() {
    // Load the main features of the User
    key := datastore.NewKey(ctx, "user", name, 0, nil)
    done <- datastore.Get(ctx, key)
  }()

  go func() {
    // Load the entries associated with the user
    q := datastore.NewQuery("entries").Filter("user", name)
    keys, err := q.GetAll(ctx, &entries)
    for i, k := range keys {
      entries[i].key = k
    }
    done <- err
  }()

  success := true
  // Wait for the queries to finish in parallel
  for i := 0; i < 2 /* count the funcs above */; i++ {
    if err := <-done; err != nil {
      ctx.Errorf("loaduser: %s", err)
      success = false
    }
  }
  if !success {
    return
  }

  // maybe more stuff here
}

この同じアプローチは、データストアの呼び出し、urlfetch、ファイルの読み込みなど、同時に時間がかかる可能性のある複数の処理を実行する必要があるほとんどすべてのコンテキストで使用できます。

于 2013-03-02T02:13:50.620 に答える
2

Go には非同期用の明示的な API はありません。代わりに go ルーチンを使用する必要があります。これに関する情報源は見たことがありませんが、go ルーチンを簡単に使用できるため、async API が存在しないのではないかと思います。

于 2013-03-01T22:46:40.590 に答える