Czy istnieje analogiczny algorytm Go do asynchronicznych API datastore Pythona/Javy? A może po prostu użyć zwykłego API ze słowem kluczowym go
?GAE Go - Async Datastore API?
Odpowiedz
Nie ma odpowiednika Go dla asynchronicznych API języka Python lub Java dla dowolnej usługi AppEngine. W rzeczywistości biblioteka standardowa Go również nie ma nic w standardowym stylu asynchronicznym. Powodem jest to, że w Go, piszesz funkcje używając stylu blokowania i komponujesz je używając podstawowych prymitywów współbieżnościowych w zależności od potrzeb. Chociaż nie można po prostu przydzielić go
na początku połączenia dastore.Get
, nadal jest to stosunkowo proste. Rozważmy następujący, contrived przykład:
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
}
To samo podejście można stosować w prawie każdym kontekście, w którym trzeba uruchomić więcej niż jedną rzecz, która może zająć trochę czasu w tym samym czasie, czy to wezwanie magazyn danych, urletch, ładowanie pliku itp.
Nie ma jawnego API dla asynchronizatora w Go. Zamiast tego powinieneś użyć procedur go. Nie widziałem żadnego źródła na ten temat, ale podejrzewam, że nie ma tam async API z powodu łatwości używania procedur go.
- 1. gae datastore backup
- 2. Złożone zapytania za pomocą datastore GAE
- 3. GAE Go - Jak używać GetMulti z nieistniejącymi kluczami encji?
- 4. Częściowe pasujące wyszukiwanie GAE API
- 5. Jak importować lokalny pakiet Go w GAE
- 6. Google Cloud Datastore vs Google App Engine
- 7. Jak debugować python GAQ, gql i datastore?
- 8. Wywołanie API nie działa wewnątrz Anko Async
- 9. GAE API, aby znaleźć miejsce, w którym działa aplikacja - lokalna maszyna LUB chmura gae
- 10. Android API z Go
- 11. GAE - nie można pobrać adresu URL z BigQuery API
- 12. Przechowuj obiekt w pamięci podręcznej GAE w Go
- 13. Python GAE poświadczenia UrlFetch
- 14. Zredukuj operację odczytu Datastore
- 15. Jak mogę wywołać metodę async Go na przykład Main()?
- 16. Twitter Streaming na GAE
- 17. GAE plugin lub GAE appcfg.cmd nie pracują z --enable_jar_splitting parametr
- 18. Punkty końcowe w chmurze GAE - aktualizacja Api po wdrożeniu
- 19. Zestaw danych GAE do płukania w magazynie GAE po przeprowadzeniu testów jednostkowych
- 20. GAE dev_appserver.py przez HTTPS
- 21. Adapter EmberJS DataStore, który obsługuje HATEOAS
- 22. Chcesz zrozumieć async
- 23. GAE Maven, jak wdrożyć
- 24. AppEngine: ograniczenia dotyczące "rodzaju" jednostek Datastore Entity?
- 25. GAE 500 server error
- 26. Jak skutecznie wdrażać sesje w GAE?
- 27. asynchroniczny filtr akcji: Async i AuthorizeAttribute w ASP.NET WEB API
- 28. Skutecznie użyj async/await z ASP.NET Web API
- 29. Async Web Api Controller - Jak radzić sobie z odwołaniami?
- 30. async ładowanie javascript z document.write
Jak to działa, skoro aplikacje Go na GAE działają w jednym wątku? –
Środowisko wykonawcze Go multipleksuje wiele goroutines na jednym wątku systemu operacyjnego. W rzeczywistości wartością domyślną nawet poza AppEngine jest GOMAXPROCS = 1, co oznacza, że tylko jeden goroutine będzie aktywnie uruchamiał twój kod. Mimo to środowisko uruchomieniowe przełącza się między goroutinami, gdy komunikują się, blokują, uruchamiają syscall lub czekają na blokadę. –
Dzięki. Czy istnieje nawet korzyść z wydajności, jeśli działają w jednym wątku? Wybacz mi moją ignorancję. Edycja: Wydaje mi się, że korzyści związane z wydajnością będą pochodzić z wykonania kodu Go podczas oczekiwania na wywołanie I/O, aby powrócić? –