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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 108
  • Облачные технологии14 073
  • QA вакансии3 460
  • Backend вакансии2 114
  • Инженер данных1 805
  • Продакт-менеджер1 266

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии986
  • AI вакансии955
  • Frontend вакансии745
  • Mobile вакансии44

По стеку

  • Go8 652
  • Java6 545
  • Node.js2 019
  • .NET1 721
  • Kotlin1 623
  • Rust1 453
  • C#710
  • PHP683
  • C++571

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

  • Kubernetes7 763
  • DevOps вакансии6 060
  • Linux-инфраструктура5 492
  • Terraform / IaC4 261
  • CI/CD3 241
  • Мониторинг и Observability1 783
  • SRE566
  • Кибербезопасность453

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

  • Data Scientist1 140
  • Бизнес-аналитик930
  • Аналитик данных853
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 321
  • Вакансии в Европе23 862
  • Вакансии в Канаде4 479
  • Работа в России3 913

По формату

  • Удалённые вакансии75 064
  • Релокация в США44 314
  • Гибридная работа12 393
  • Офисная работа7 089

По уровню

  • Senior вакансии42 691
  • Middle вакансии20 905
  • Junior вакансии6 727

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Как работает GVL и как он влияет на threads в MRI Ruby?

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

GVL — мьютекс MRI, позволяющий только одному потоку выполнять Ruby-код одновременно; для IO-задач потоки эффективны (GVL отдаётся при ожидании), для CPU-параллелизма используйте процессы или Ractors.

Как работает GVL

GVL удерживается потоком, пока он выполняет Ruby-инструкции. Поток освобождает GVL в двух случаях:

  • При блокирующем системном вызове: ввод-вывод (read, write, accept), sleep, wait. В этот момент другой поток может захватить GVL и продолжить работу.
  • По истечении кванта времени (~100 мс или ~1000 инструкций): интерпретатор принудительно переключает потоки через сигнал RUBY_THREAD_TIMESLICE.
require 'benchmark'
require 'thread'

# CPU-bound: потоки не дают прироста из-за GVL
def cpu_work
  10_000_000.times { |i| i * i }
end

sequential_time = Benchmark.realtime do
  cpu_work
  cpu_work
end

threaded_time = Benchmark.realtime do
  t1 = Thread.new { cpu_work }
  t2 = Thread.new { cpu_work }
  t1.join
  t2.join
end

puts "Sequential: #{sequential_time.round(2)}s"
puts "Threaded:   #{threaded_time.round(2)}s"
# Результат почти одинаковый — GVL не даёт параллельности CPU

GVL (Global VM Lock) в MRI Ruby

GVL (Global VM Lock), ранее называемый GIL (Global Interpreter Lock) — это мьютекс, встроенный в интерпретатор MRI (CRuby). Он гарантирует, что в любой момент времени только один поток Ruby выполняет Ruby-код. Остальные потоки ждут освобождения блокировки.

IO-bound задачи: потоки работают эффективно

Когда поток ожидает IO, он отдаёт GVL, и другие потоки продолжают работать. Поэтому для HTTP-запросов, работы с БД, файловых операций потоки дают реальный прирост.

require 'net/http'
require 'benchmark'

urls = Array.new(5) { "http://example.com" }

# IO-bound: потоки дают ~5x ускорение
threaded_time = Benchmark.realtime do
  threads = urls.map do |url|
    Thread.new do
      Net::HTTP.get(URI(url))
    end
  end
  threads.each(&:join)
end

puts "5 concurrent requests: #{threaded_time.round(2)}s"
# vs ~5x дольше при последовательном выполнении

Нативные C-расширения и GVL

C-расширения могут явно освобождать GVL через rb_thread_call_without_gvl(). Многие популярные гемы делают это для CPU-интенсивных операций: bcrypt, nokogiri (парсинг XML), некоторые драйверы БД. Это позволяет реальному параллелизму в C-коде при многопоточном Ruby.

Альтернативы для CPU-параллелизма

  • Process.fork / multiprocessing: каждый процесс имеет собственный GVL. Puma в режиме cluster использует это.
  • Ractors (Ruby 3.0+): новая модель параллелизма без GVL. Каждый Ractor изолирован, объекты между ними передаются через каналы или freeze. Пока экспериментальная, но работает без GVL.
  • JRuby / TruffleRuby: не имеют GVL, реально параллельны в потоках.
# Ractors — параллельный CPU без GVL (Ruby 3.0+)
results = (1..4).map do |i|
  Ractor.new(i) do |n|
    # Реально параллельно — нет GVL!
    sum = 0
    (n * 1_000_000).times { |j| sum += j }
    sum
  end
end.map(&:take)

puts results.sum

Thread safety при GVL

GVL не защищает от состояний гонки в Ruby! Он гарантирует, что Ruby-инструкции атомарны на уровне C, но составные операции (read-modify-write) всё равно не потокобезопасны без мьютекса.

counter = 0
threads = 100.times.map do
  Thread.new { 1000.times { counter += 1 } }  # race condition!
end
threads.each(&:join)
puts counter  # не 100_000! Гонка данных.

# Правильно:
mutex = Mutex.new
counter = 0
threads = 100.times.map do
  Thread.new { 1000.times { mutex.synchronize { counter += 1 } } }
end
threads.each(&:join)
puts counter  # 100_000

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

  • GVL не защищает от race conditions: составные операции типа hash[key] ||= [] не атомарны — используйте Mutex или Concurrent::Map из concurrent-ruby.
  • CPU-bound потоки бесполезны в MRI: добавление потоков для вычислений не даёт ускорения. Используйте процессы (fork) или Ractors.
  • Дедлоки: Thread#join + неверная очерёдность мьютексов = дедлок. Используйте Mutex#try_lock или задавайте таймаут.
  • Thread.raise небезопасен: вызов thread.raise извне может прервать поток в любой точке, включая ensure-блоки. Предпочитайте совместную отмену через флаги или Queue.
  • Fiber vs Thread: Fiber не переключаются автоматически — это кооперативная многозадачность. Fiber::Scheduler (Ruby 3.0+) позволяет неблокирующий IO без потоков.
  • ObjectSpace не потокобезопасен: не итерируйте ObjectSpace в многопоточном коде без остановки GC.

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

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

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

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

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

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

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

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

Источники

  • https://rubystyle.guide/
  • https://docs.ruby-lang.org/en/master/

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

Rubyrisk-analysisruby-productiontechnical-depth

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

Ruby вакансии
  • Full-Stack Software Engineer, Communication Tools
  • Intermediate Backend Engineer, Authorization
  • Lead System Engineer
  • Data Engineer Expert
  • Backend Software Engineer