Есть ли аналог Go для API-интерфейсов Python/Java async datastore? Или можно использовать обычный API с ключевым словом go
?GAE Go - API асинхронного хранилища данных?
ответ
Существует нет Go эквивалентно асинхронным API-интерфейсам Python или Java для любой службы AppEngine. Фактически, стандартная библиотека 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, загрузка файла и т. д.
Нет явного API для async в Go. Вместо этого вы должны использовать подпрограммы. Я не видел никаких источников на этом, но я подозреваю, что асинхронный API не существует из-за того, насколько легко использовать подпрограммы go.
- 1. Тип хранилища данных хранилища GAE
- 2. Go Rest API на GAE
- 3. GAE Multitenancy and Transaction - Go
- 4. Эффективное использование хранилища данных GAE
- 5. Опорожнение хранилища данных в GAE
- 6. Создание уникального хранилища данных GAE
- 7. Неисправность Загрузка данных из хранилища данных GAE
- 8. Репликация данных из хранилища данных GAE
- 9. Общие параллельные транзакции хранилища данных GAE
- 10. Тестирование хранилища данных GAE с помощью потоков
- 11. GAE Go runtime SLA
- 12. Ограничение индекса хранилища GAE
- 13. Проблема разбора хранилища GAE
- 14. front-end для хранилища данных GAE - phpMyAdmin-like для GAE
- 15. Очистить все данные от хранилища данных GAE
- 16. Индекс не обновляется для хранилища данных GAE
- 17. Как создать локальную копию хранилища данных GAE?
- 18. gae unit testing hrd несоответствие хранилища данных
- 19. GAE - Интерпретация хранилища данных индексирует пределы
- 20. Получение ключа из хранилища данных (GAE)
- 21. Операции записи хранилища данных GAE dalay
- 22. Использование хранилища данных GAE в разных версиях
- 23. Что использует Java для хранилища данных GAE
- 24. Как установить ключ для хранилища данных GAE?
- 25. Как построить индексы хранилища данных (PHP GAE)
- 26. Go Gae NewContext
- 27. Ошибка utf8 в средстве просмотра хранилища данных (Go runtime)
- 28. Как включить API облачного хранилища данных в GAE, чтобы другое приложение GAE могло связываться с ним?
- 29. GAE Go и длинный опрос?
- 30. go/appengine: более быстрые тесты хранилища данных
Как это работает, учитывая, что приложения Go на GAE работают в одном потоке? –
The Go runtime мультиплексирует множество goroutines на один поток операционной системы. Фактически, по умолчанию даже вне AppEngine GOMAXPROCS = 1, что означает, что только один goroutine будет активно запускать ваш код. Тем не менее, несмотря на это, среда выполнения будет переключаться между goroutines, когда они обмениваются данными, блокируют, выполняют системный вызов или ждут блокировки. –
Спасибо. Таким образом, есть ли даже преимущество в производительности, если они работают на одном потоке? Простите мое невежество. Редактировать: Я полагаю, что преимущество в производительности будет зависеть от исполняемого кода Go, пока он ждет возврата вызова ввода-вывода? –