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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python14 032
  • Облачные технологии9 925
  • QA вакансии3 157
  • Android1 684
  • Инженер данных1 071
  • Продакт-менеджер317

Разработка

  • iOS1 564
  • Backend вакансии1 523
  • AI вакансии761
  • Fullstack вакансии612
  • Frontend вакансии527
  • Mobile вакансии28

По стеку

  • Go7 794
  • Java4 858
  • Node.js1 556
  • Kotlin1 341
  • Rust1 284
  • .NET1 169
  • PHP514
  • C++341
  • C#270

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

  • Kubernetes5 760
  • Linux-инфраструктура4 462
  • DevOps вакансии4 116
  • Terraform / IaC3 213
  • Мониторинг и Observability1 531
  • CI/CD1 154
  • SRE416
  • Кибербезопасность29

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

  • Аналитик данных611
  • Бизнес-аналитик534
  • Data Scientist444
  • Системный аналитик80

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

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

По регионам

  • Вакансии в США31 393
  • Вакансии в Европе11 635
  • Работа в России3 672
  • Вакансии в Канаде2 524

По формату

  • Удалённые вакансии47 029
  • Релокация в США31 393
  • Гибридная работа8 379
  • Офисная работа6 474

По уровню

  • Senior вакансии27 937
  • Middle вакансии12 203
  • Junior вакансии4 563

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Как Ruby обрабатывает параллелизм? Что такое Threads, Fibers и GIL?

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

MRI Ruby имеет GVL (Global VM Lock), который не позволяет нескольким потокам выполнять Ruby-код одновременно. Thread полезен для I/O-bound задач. Fiber — кооперативная корутина для неблокирующего I/O. Ractor (Ruby 3) обходит GVL для CPU-bound параллелизма.

Thread

# Параллельные HTTP-запросы (I/O-bound — GVL снимается)
require 'net/http'
require 'uri'

urls = [
  "https://httpbin.org/delay/1",
  "https://httpbin.org/delay/1",
  "https://httpbin.org/delay/1"
]

start = Time.now
threads = urls.map do |url|
  Thread.new do
    uri = URI.parse(url)
    Net::HTTP.get_response(uri)
  end
end
results = threads.map(&:value)  # value ждёт завершения и возвращает результат
puts "#{results.size} requests in #{Time.now - start:.2f}s"  # ~1s вместо ~3s

GVL / GIL — Global VM Lock

В MRI (CRuby) существует Global VM Lock (раньше называли GIL). Это мьютекс, который гарантирует, что только один поток Ruby выполняет VM-инструкции в любой момент времени. GVL защищает внутренние структуры данных интерпретатора от гонок.

Следствия:

  • CPU-bound задачи не ускоряются от многопоточности в MRI — потоки не выполняются параллельно.
  • I/O-bound задачи (HTTP, файлы, БД) ускоряются — при ожидании I/O GVL временно освобождается, другой поток получает управление.
  • JRuby и TruffleRuby не имеют GVL — там Thread даёт настоящий параллелизм.

Thread-безопасность

# Гонка данных (unsafe)
counter = 0
threads = 100.times.map { Thread.new { counter += 1 } }
threads.each(&:join)
puts counter  # может быть не 100!

# Безопасно через Mutex
counter = 0
mutex = Mutex.new
threads = 100.times.map do
  Thread.new { mutex.synchronize { counter += 1 } }
end
threads.each(&:join)
puts counter  # => 100

Fiber — кооперативные корутины

Fiber — лёгкая корутина, переключается вручную через Fiber.yield/resume. Не создаёт поток ОС.

# Генератор с Fiber
fib = Fiber.new do
  a, b = 0, 1
  loop do
    Fiber.yield a
    a, b = b, a + b
  end
end

10.times { print "#{fib.resume} " }
# => 0 1 1 2 3 5 8 13 21 34

Fiber::Scheduler (Ruby 3.0+) — неблокирующий I/O

Хук Fiber::Scheduler позволяет реализовать event loop: обычный код с sleep, read, write автоматически становится неблокирующим внутри Fiber:

require 'async'  # гем: gem 'async'

Async do
  task1 = Async { sleep 1; "task1" }
  task2 = Async { sleep 1; "task2" }
  puts [task1.wait, task2.wait].inspect
  # Выполняется за ~1s, не за ~2s
end

Ractor (Ruby 3) — настоящий параллелизм

# Параллельные вычисления без GVL
ractors = 4.times.map do |i|
  Ractor.new(i) { |id| id * id }
end
results = ractors.map(&:take)  # => [0, 1, 4, 9]

Сравнение примитивов

  • Thread: вытесняющий, OS-поток, GVL у MRI. I/O-bound задачи, фоновые операции.
  • Fiber: кооперативный, зелёный поток, явное переключение. Генераторы, event loop, async I/O.
  • Ractor: OS-поток, без GVL, изолированная память. CPU-bound параллелизм.

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

  • Uncaught exception в Thread молча убивает поток (по умолчанию). Устанавливайте Thread.abort_on_exception = true или вызывайте thread.join/thread.value для получения исключения.
  • Мьютекс нельзя захватить дважды из одного потока (Mutex#synchronize не реентерабельный) — дедлок.
  • Thread-local переменные (Thread.current[:key]) не видны в дочерних потоках — легко пропустить.
  • Fiber не может быть возобновлён из другого потока (до Ruby 3 с Fiber::Scheduler) — не пытайтесь шарить Fiber между потоками.
  • GVL освобождается при нативных I/O-вызовах, но некоторые C-расширения держат его дольше — профилируйте с GVL Profiler или ruby-gvl-profiler.
  • В Puma (многопоточный сервер) один запрос = один Thread; в Falcon — один Fiber. Понимайте модель конкурентности своего сервера.
  • ActiveRecord не безопасен для использования одного Connection из нескольких потоков — connection pool и with_connection обязательны.
  • Дедлоки между мьютексами труднее диагностировать в Ruby, чем в Go — используйте Thread.list.each(&:backtrace) для анализа зависших потоков.

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

  • Сводить threads fibers gvl к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: объектная динамическая модель Ruby, где почти всё является объектом, а методы ищутся через ancestor chain.
  • Не отделять validation, authorization, transaction boundary и business logic.

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

  • Объясняет threads fibers gvl через конкретную точку lifecycle в Ruby.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

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

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

Источники

  • https://docs.ruby-lang.org/en/master/Thread.html
  • https://docs.ruby-lang.org/en/master/
←Предыдущий вопросЧто такое `Struct` и `OpenStruct` в Ruby и когда их стоит использовать?Следующий вопрос→Что такое ключевое слово `yield` в Ruby и как оно работает?

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

RubyBackend-Engineeringconcurrencyreliabilityruby-ecosystem

Вакансии с этим навыком

Ruby вакансии
  • Senior Software Engineer
  • Senior DevOps Engineer
  • Senior Software Engineer (P4 DAM)
  • Cloud Engineer
  • DevOps Engineer - Recommendation Department, AI & Data Division (AIDD)

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

  • В чём разница между symbols и strings в Ruby и когда использовать каждый?
  • В чём разница между nil, false и другими ложными значениями (falsy values) в Ruby?
  • В чём разница между proc и lambda с точки зрения поведения return и арности (arity)?
  • Что такое модули Ruby и чем они отличаются от классов?