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

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

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

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

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

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

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

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

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

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

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

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

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

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

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

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

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

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

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

По регионам

  • Вакансии в США43 685
  • Вакансии в Европе23 862
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 887
  • Релокация в США43 685
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

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

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

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

В чём разница между send/receive и передачей сообщений через GenServer?

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

send/receive — низкоуровневые примитивы обмена сообщениями между процессами. GenServer — высокоуровневый OTP behaviour поверх них, добавляющий синхронные call (с таймаутом), асинхронные cast, обработку системных сообщений и интеграцию с Supervisor.

send/receive — низкоуровневая передача сообщений

send(pid, message) помещает сообщение в mailbox указанного процесса и немедленно возвращает управление. receive do ... end извлекает первое совпавшее сообщение из mailbox текущего процесса. Это примитив BEAM VM — минимальный уровень абстракции:

parent = self()

worker = spawn(fn ->
  receive do
    {:compute, x, from} ->
      send(from, {:result, x * x})
  end
end)

send(worker, {:compute, 7, parent})

receive do
  {:result, val} -> IO.puts("Got #{val}")  # => Got 49
after
  3000 -> IO.puts("Timeout")
end

GenServer — высокоуровневая абстракция

GenServer — OTP behaviour, построенный поверх send/receive. Он стандартизирует паттерны: синхронный call (запрос + ответ с таймаутом), асинхронный cast (только запрос), обработку системных сообщений (:EXIT, :DOWN, рестарт Supervisor), логирование и трассировку.

defmodule Cache do
  use GenServer

  # Клиентский API
  def start_link(_), do: GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
  def put(key, val), do: GenServer.cast(__MODULE__, {:put, key, val})
  def get(key), do: GenServer.call(__MODULE__, {:get, key})

  # Callbacks
  @impl GenServer
  def init(state), do: {:ok, state}

  @impl GenServer
  def handle_cast({:put, key, val}, state) do
    {:noreply, Map.put(state, key, val)}
  end

  @impl GenServer
  def handle_call({:get, key}, _from, state) do
    {:reply, Map.get(state, key), state}
  end
end

Cache.start_link([])
Cache.put(:user, "Alice")
Cache.get(:user)  # => "Alice"

Ключевые отличия

  • Синхронность: GenServer.call блокирует вызывающий процесс до получения ответа (с таймаутом 5000 мс по умолчанию); send всегда неблокирующий.
  • Обработка ошибок: GenServer перехватывает исключения в колбэках и завершает процесс аккуратно, уведомляя Supervisor; receive не имеет встроенной защиты.
  • Системные сообщения: GenServer автоматически обрабатывает :system-сообщения (трассировка, горячая замена кода, смена режима), которые в ручном receive нужно обрабатывать самостоятельно.
  • Интеграция с OTP: GenServer совместим с Supervisor, :sys.trace, :observer; сырой spawn + receive — нет.
  • Сложность реализации: send/receive — 3-5 строк для простых задач; GenServer — ~20 строк, но масштабируется без рефакторинга.

Когда использовать send/receive напрямую

  • Одноразовые задачи через Task.async/await (Task использует send/receive внутри).
  • Простые сигналы между тесно связанными процессами (например, родитель-дочерний в тестах).
  • Реализация кастомного цикла сообщений в специализированных серверах (rare case).

handle_info для внешних send

Если кто-то отправил сырое сообщение через send в GenServer-процесс, оно обрабатывается через handle_info/2:

@impl GenServer
def handle_info({:DOWN, ref, :process, pid, reason}, state) do
  # монитор упавшего воркера
  {:noreply, cleanup(state, ref)}
end

@impl GenServer
def handle_info(:tick, state) do
  Process.send_after(self(), :tick, 1000)
  {:noreply, do_work(state)}
end

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

  • send в GenServer в обход API — прямой send(pid, {:put, key, val}) в GenServer вместо cast обходит типизацию колбэков и может привести к необработанному сообщению в mailbox, если нет handle_info.
  • GenServer.call дедлок — если GenServer вызывает call сам в себя синхронно, это гарантированный дедлок; используйте cast или send(self(), ...) + handle_info.
  • Таймаут call по умолчанию 5000 мс — при превышении вызывающий процесс получает exit, а GenServer продолжает обрабатывать запрос; ответ придёт в mailbox как «мусорное» сообщение.
  • Необработанные сообщения в receive — паттерны в receive не покрывающие все типы сообщений оставят «мусор» в mailbox навсегда; в GenServer это решает handle_info(msg, state) -> {:noreply, state} как фолбэк.
  • cast без подтверждения — cast не гарантирует доставку или обработку; если процесс умер до обработки, сообщение потеряно молча.
  • Сериализация через call — все запросы к GenServer обрабатываются последовательно в одном потоке; при высоком RPS это узкое место; рассмотрите пул процессов через :poolboy или partitioned Registry.

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

  • Сводить send receive vs genserver к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Elixir компилируется в BEAM bytecode и наследует процессы, message passing, supervision и hot-code friendly модель Erlang VM.
  • Не отделять validation, authorization, transaction boundary и business logic.
  • Менять похожие API местами без учёта семантики ошибок и ownership.

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

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

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

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

Источники

  • https://hexdocs.pm/elixir/GenServer.html
  • https://hexdocs.pm/elixir/
←Предыдущий вопросЧто такое Mix в Elixir и каковы его типичные задачи?Следующий вопрос→Что такое protocols в Elixir и как они обеспечивают полиморфизм?

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

ElixirBackend-Engineeringconcurrencyelixir-ecosystemreliability

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

  • Automation QA Engineer (Payments)

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

  • В чём разница между spawn, Task и GenServer для выполнения конкурентного кода?
  • Что такое pattern matching в Elixir и как он используется в ветвях функций (function clauses)?
  • В чём разница между модулем и структурой (struct) в Elixir?
  • Что такое иммутабельность в Elixir и почему она важна для параллелизма?