Перейти к содержимому

Avito / Авито (платформа)

Вопросы: стандартные вопросы про горутины, каналы, пакет sync и рантайм Go.

type Person struct {
Name string
}
func changeName(person *Person) {
person = &Person{
Name: "Alice ",
}
}
func main() {
person := &Person{
Name: "Bob ",
}
fmt.Println(person.Name)
changeName(person)
fmt.Println(person.Name)
}

Доп. вопрос: что нужно изменить в функции, чтобы выводилось «Alice»

Заголовок раздела «Доп. вопрос: что нужно изменить в функции, чтобы выводилось «Alice»»
const numRequests = 10000
var count int
func networkRequest() {
time.Sleep(time.Millisecond) // Эмуляция сетевого запроса
count++
}
func main() {
for i := 0; i < numRequests; i++ {
networkRequest()
}
fmt.Println(count)
}

Доп. задача: изменить код так, чтобы запросы выполнялись в многопоточном режиме за минимальное время.

  • для чего тут нужна вейтгруппа? go/sync
  • за какое время выполнятся все запросы при GOMAXPROCS=1? go/runtime
  • как при этом будет работать P с горутинами в этой задаче? go/concurrency
  • что такое netpoller? go/runtime
  • почему необходимо использовать мьютекс? А еще можно решить эту проблему? go/sync
// Есть функция, работающая неопределенно долго и возвращающая число.
// Еe тело нельзя изменять (представим, что внутри сетевой запрос).
func unpredictableFunc() int64 {
rnd := rand.Int63n(5000)
time.Sleep(time.Duration(rnd) * time.Millisecond)
return rnd
}
// Нужно изменить функцию обертку, которая будет работать с заданным таймаутом (например, 1 секунду).
// Если "длинная "функция отработала за это время - отлично, возвращаем результат.
// Если нет - возвращаем ошибку. Результат работы в этом случае нам не важен.
//
// Дополнительно нужно измерить, сколько выполнялась эта функция (просто вывести в лог).
// Сигнатуру функцию обертки менять можно.
func predictableFunc() int64 {
return unpredictableFunc()
}
func main() {
fmt.Println(predictableFunc())
}