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

+1 088новых вакансий за сутки·80 376вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python14 930
  • Облачные технологии11 512
  • QA вакансии3 347
  • Backend вакансии1 791
  • Инженер данных1 397
  • Продакт-менеджер842

Разработка

  • Android1 731
  • iOS1 605
  • AI вакансии858
  • Fullstack вакансии725
  • Frontend вакансии617
  • Mobile вакансии31

По стеку

  • Go8 182
  • Java5 283
  • Node.js1 704
  • Kotlin1 419
  • Rust1 360
  • .NET1 290
  • PHP551
  • C++394
  • C#369

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

  • Kubernetes6 474
  • Linux-инфраструктура4 834
  • DevOps вакансии4 737
  • Terraform / IaC3 590
  • Мониторинг и Observability1 636
  • CI/CD1 541
  • SRE504
  • Кибербезопасность245

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

  • Data Scientist769
  • Аналитик данных748
  • Бизнес-аналитик722
  • Системный аналитик94

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

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

По регионам

  • Вакансии в США40 112
  • Вакансии в Европе16 478
  • Работа в России3 877
  • Вакансии в Канаде3 839

По формату

  • Удалённые вакансии64 386
  • Релокация в США40 296
  • Гибридная работа9 283
  • Офисная работа6 552

По уровню

  • Senior вакансии35 880
  • Middle вакансии17 118
  • Junior вакансии5 838

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

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Что такое Task в Swift Concurrency и что такое TaskGroup?

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

Task запускает одну асинхронную задачу с возможностью отмены через task.cancel() и проверкой Task.isCancelled. TaskGroup (withTaskGroup/withThrowingTaskGroup) запускает N параллельных задач и собирает результаты через for await in group.

Task — одиночная асинхронная задача

// Неструктурированная Task — запускается немедленно
let task = Task {
    let result = await fetchData()
    print(result)
}

// Ожидание результата
let value = await task.value

// Отмена
task.cancel()

Task и TaskGroup в Swift Concurrency

Task и TaskGroup — основные примитивы структурированного параллелизма в Swift, введённые в Swift 5.5 (iOS 15+).

Типы Task

// Task с возвратом значения
let task = Task<String, Error> {
    try await fetchString()
}
let result = try await task.value

// Task с приоритетом
let backgroundTask = Task(priority: .background) {
    await processLargeDataset()
}

// Task.detached — не наследует actor context и приоритет
let detached = Task.detached(priority: .low) {
    // НЕ наследует @MainActor даже если вызван с главного актора
    await backgroundWork()
}

Отмена задач

@MainActor
class SearchViewModel: ObservableObject {
    @Published var results: [String] = []
    private var searchTask: Task<Void, Never>?

    func search(query: String) {
        searchTask?.cancel() // отменяем предыдущий поиск
        searchTask = Task {
            do {
                try Task.checkCancellation() // ранняя проверка
                let data = try await searchAPI(query: query)
                try Task.checkCancellation() // после долгой операции
                self.results = data
            } catch is CancellationError {
                // нормальная отмена, не логируем
            } catch {
                print("Search failed:", error)
            }
        }
    }

    deinit { searchTask?.cancel() }
}

TaskGroup — параллельные задачи

TaskGroup позволяет запускать несколько задач параллельно и собирать результаты.

// withTaskGroup — без throws
func fetchAllUsers(ids: [UUID]) async -> [User] {
    await withTaskGroup(of: User?.self) { group in
        for id in ids {
            group.addTask {
                try? await fetchUser(id: id) // ошибки игнорируются
            }
        }
        var users: [User] = []
        for await user in group {
            if let user { users.append(user) }
        }
        return users
    }
}

// withThrowingTaskGroup — с propagation ошибок
func fetchRequiredUsers(ids: [UUID]) async throws -> [User] {
    try await withThrowingTaskGroup(of: User.self) { group in
        for id in ids {
            group.addTask { try await fetchUser(id: id) }
        }
        var users: [User] = []
        for try await user in group { // первая ошибка отменяет группу
            users.append(user)
        }
        return users
    }
}

Ограничение параллелизма

// Максимум N параллельных задач
func processWithLimit<T>(_ items: [T], maxConcurrency: Int, work: @escaping (T) async throws -> Void) async throws {
    try await withThrowingTaskGroup(of: Void.self) { group in
        var activeTasks = 0

        for item in items {
            if activeTasks >= maxConcurrency {
                try await group.next() // ждём завершения одной задачи
                activeTasks -= 1
            }
            group.addTask { try await work(item) }
            activeTasks += 1
        }
        try await group.waitForAll()
    }
}

// Использование: не более 3 параллельных загрузок
try await processWithLimit(urls, maxConcurrency: 3) { url in
    await downloadImage(from: url)
}

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

  • Task.detached не наследует actor context — вызов UI-обновлений из detached task без await MainActor.run вызывает ошибки в Swift 6.
  • Отмена TaskGroup отменяет все дочерние задачи, но не ждёт их завершения — результаты уже начатых задач теряются.
  • Task.checkCancellation() бросает CancellationError — не забывайте обрабатывать его отдельно от других ошибок.
  • Создание тысяч Task {} без ограничения параллелизма исчерпывает thread pool — используйте TaskGroup с ограничением.
  • В withThrowingTaskGroup первая ошибка из for try await отменяет остальные задачи — если нужны все результаты, собирайте ошибки в Result.
  • Task не сохраняет приоритет при передаче через actor boundary — используйте явный priority:.
  • iOS 15 minimum target для async/await — на iOS 13-14 нужен withCheckedContinuation для обёртки completion-based API.
  • ViewModel с @MainActor и TaskGroup: дочерние задачи в группе не наследуют MainActor — UI обновления нужно явно переносить через await MainActor.run.

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

  • Сводить «Task в Swift Concurrency и что такое TaskGroup» к синтаксису и не объяснять ARC.
  • Игнорировать жизненный цикл, основной поток или момент освобождения ресурсов в сценарии swift-16.
  • Выбирать API по привычке, не проверяя состояние, ошибки, доступность и платформенные ограничения.

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

  • Формулирует точную модель для «Task в Swift Concurrency и что такое TaskGroup» и подтверждает ее корректным примером.
  • Умеет связать ответ с Swift Concurrency, тестированием и отладкой на устройстве.
  • Называет ограничения подхода swift-16, включая производительность, память и сопровождение.

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

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

Источники

  • https://docs.swift.org/swift-book/LanguageGuide/Concurrency.html
←Предыдущий вопросЧто такое Swift Actors и как они помогают с параллелизмом?Следующий вопрос→Какие production-риски чаще всего возникают в проектах на Swift: производительность, зависимости, конкурентность, деплой или observability?

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

Swiftconcurrency-debuggingMobile-Engineering

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

  • Что такое optionals в Swift и как безопасно их разворачивать?
  • В чём разница между strong, weak и unowned ссылками?
  • Для каких задач Swift является сильным выбором, а где лучше честно выбрать другой язык?
  • В чём разница между class и struct в Swift?