Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+694новые вакансии за сутки·52 494вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 662
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python6 244
  • Облачные технологии4 749
  • QA вакансии1 736
  • Android1 148
  • Инженер данных800
  • Продакт-менеджер321

Разработка

  • iOS1 092
  • Backend вакансии1 046
  • Fullstack вакансии453
  • AI вакансии391
  • Frontend вакансии376
  • Mobile вакансии27

По стеку

  • Go3 590
  • Java2 153
  • Kotlin942
  • Node.js767
  • Rust544
  • .NET496
  • PHP267
  • C++220
  • C#198

DevOps и инфраструктура

  • Kubernetes2 686
  • Linux-инфраструктура2 117
  • DevOps вакансии1 960
  • Terraform / IaC1 615
  • CI/CD871
  • Мониторинг и Observability742
  • SRE228
  • Кибербезопасность47

Аналитика и данные

  • Аналитик данных495
  • Data Scientist449
  • Бизнес-аналитик351
  • Системный аналитик54

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США23 835
  • Вакансии в Европе9 341
  • Работа в России3 283
  • Вакансии в Канаде2 140

По формату

  • Удалённые вакансии41 311
  • Релокация в США23 835
  • Гибридная работа4 058
  • Офисная работа2 949

По уровню

  • Senior вакансии20 396
  • Middle вакансии11 620
  • Junior вакансии3 665

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Wise139 вакансий
  • Grab134 вакансии
  • Infobip28 вакансий
  • Adyen23 вакансии
  • Darktrace17 вакансий
  • Spotify15 вакансий
  • Celonis11 вакансий
  • Razorpay9 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме GoВсе вопросы
GoMiddleТеория

Что такое пакет context и почему он важен для управления goroutine?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

context.Context несёт дедлайны, отмену и request-scoped значения через весь стек; goroutine обязана проверять ctx.Done() и передавать ctx в каждый внешний вызов — только тогда цепочка отмены работает сквозь db, http и grpc.

Пример: HTTP-сервер с таймаутом и worker

package main

import (
	"context"
	"database/sql"
	"fmt"
	"net/http"
	"time"
)

func handler(db *sql.DB) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		// Ограничиваем весь запрос 500 мс
		ctx, cancel := context.WithTimeout(r.Context(), 500*time.Millisecond)
		defer cancel() // обязателен: освобождает таймер

		var result string
		// db.QueryRowContext передаёт ctx в драйвер;
		// если таймаут вышел — запрос отменяется на уровне TCP
		err := db.QueryRowContext(ctx, "SELECT name FROM users LIMIT 1").Scan(&result)
		if err != nil {
			if ctx.Err() == context.DeadlineExceeded {
				http.Error(w, "timeout", http.StatusGatewayTimeout)
				return
			}
			http.Error(w, err.Error(), http.StatusInternalServerError)
			return
		}
		fmt.Fprintln(w, result)
	}
}

// Worker завершается по отмене контекста
func worker(ctx context.Context, jobs <-chan int) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("worker stopped:", ctx.Err())
			return
		case j, ok := <-jobs:
			if !ok {
				return
			}
			_ = j // обработка задачи
		}
	}
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	jobs := make(chan int, 10)
	go worker(ctx, jobs)
	// Graceful shutdown: cancel() остановит worker
	_ = ctx
}

Что такое пакет context

Пакет context предоставляет тип context.Context — интерфейс с четырьмя методами: Deadline(), Done(), Err() и Value(). Он переносит сигнал отмены, дедлайны и ограниченное число request-scoped значений вниз по стеку вызовов: через HTTP-обработчики, вызовы базы данных, gRPC-клиенты и фоновые goroutine.

Ключевые конструкторы

  • context.Background() — корневой контекст, используется в main и тестах.
  • context.WithCancel(parent) — возвращает дочерний ctx и cancel-функцию; отмена распространяется вниз по дереву.
  • context.WithTimeout(parent, d) — автоматически отменяет через d; эквивалентен WithDeadline с time.Now().Add(d).
  • context.WithDeadline(parent, t) — отмена в абсолютный момент времени t.
  • context.WithValue(parent, key, val) — прикрепляет значение; key должен быть unexported типом, чтобы избежать коллизий.

Почему это важно для goroutine

Context сам по себе никого не убивает. Код обязан проверять ctx.Done() и передавать ctx в каждый внешний вызов: db.QueryContext, http.NewRequestWithContext, grpc.DialContext. Только тогда цепочка отмены работает сквозь все слои.

Правила использования

  • Context всегда первым аргументом функции, никогда не в полях структуры.
  • cancel() всегда через defer — даже если контекст истёк раньше, defer освободит ресурсы.
  • context.WithValue только для request-scoped данных (trace-id, auth token), не для бизнес-параметров.
  • Не переиспользовать контекст между запросами: он несёт состояние одного жизненного цикла.

Подводные камни

  • Забыть вызвать cancel() — утечка горутины таймера; особенно опасно в циклах с WithTimeout.
  • Хранить ctx в поле структуры и обращаться к нему из разных запросов — размытый жизненный цикл.
  • Передавать бизнес-данные через WithValue вместо явных параметров — скрытые зависимости, сложнее тестировать.
  • Не проверять ctx.Done() в долгих циклах: отмена не прервёт вычисление автоматически.
  • Использовать context.Background() внутри обработчика вместо r.Context() — разрывает цепочку отмены от клиента.
  • Ключ типа string в WithValue — риск коллизии с другими пакетами; нужен unexported struct{}.
  • Не проверять ctx.Err() после ошибки: нельзя отличить DeadlineExceeded от Canceled без явной проверки.
  • Слишком широкий таймаут на верхнем уровне без дочерних таймаутов на каждом внешнем вызове — один медленный downstream блокирует весь бюджет.

Частые вопросы на собеседовании

  • Для каких задач Go (Golang) является сильным выбором, а где лучше честно выбрать другой язык?
  • Как писать unit-тесты в Go? Что такое пакет testing?
  • Что происходит при добавлении элементов за пределы ёмкости slice?
  • Как Go управляет пакетами и модулями? Что такое go.mod?

Типичные ошибки

  • Считать, что создание context автоматически останавливает весь код.
  • Использовать context как хранилище зависимостей или глобального состояния.
  • Не вызывать cancel у дочерних context с timeout/deadline.

Что проверяет интервьюер

  • Объясняет наследование отмены и дедлайнов.
  • Понимает, что cancellation работает только если код слушает Done и передаёт ctx дальше.
  • Разделяет request-scoped values и обычные зависимости.

Как вы знаете этот вопрос?

Проверить себя по теме Go →

Источники

  • https://pkg.go.dev/context
  • https://go.dev/doc/effective_go
←Предыдущий вопросЧто такое goroutine? Чем она отличается от потока ОС?Следующий вопрос→Что такое channels в Go и в чём разница между буферизованными и небуферизованными channels?

Связанные темы

Goapi-designbackend-basicsCancellation