Sobes.tech
Назад к вопросам
Junior — Middle
69

Опиши свой опыт работы с системой многопроцессорной обработки данных и взаимодействием процессов

Компании, где спрашивали
ООО Цитадель
RutubeRutube

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Ожидают услышать, что есть практический опыт распараллеливания задач и понимание, когда нужны процессы, а не потоки. Важно показать, что известны способы обмена данными между процессами, а также их ограничения. Хорошо, если есть опыт работы с очередями, пайпами, shared memory или менеджерами.

Определение:

Многопроцессорная обработка данных в Python — это запуск нескольких независимых процессов для параллельного выполнения задач, особенно CPU-bound. Взаимодействие процессов — это способы передавать данные и синхронизировать работу между ними, потому что память у процессов раздельная. Для этого обычно используют очереди, каналы, общую память или файловое/сетевое хранилище.

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

Например, есть задача обработать большой набор изображений: один процесс читает файлы, несколько процессов параллельно сжимают и конвертируют их, а отдельный процесс собирает результат и пишет отчёт. Для передачи задач и результатов удобно использовать multiprocessing.Queue.

from multiprocessing import Process, Queue

def worker(input_q, output_q):
    while True:
        item = input_q.get()
        if item is None:
            break
        result = item * item
        output_q.put(result)

if __name__ == "__main__":
    input_q = Queue()
    output_q = Queue()

    p = Process(target=worker, args=(input_q, output_q))
    p.start()

    for i in range(5):
        input_q.put(i)

    input_q.put(None)  # сигнал завершения
    p.join()

    while not output_q.empty():
        print(output_q.get())

Пояснение кода:

Код показывает простую схему producer/worker. Основной процесс складывает задания в input_q, а дочерний процесс забирает их, обрабатывает и кладёт результат в output_q.
Значение None используется как sentinel — специальный сигнал, что новые задачи больше не придут. После этого воркер завершает цикл.
Process.start() запускает отдельный процесс, а join() позволяет дождаться его завершения.

Ключевые моменты:

  • Процессы используют отдельную память, поэтому обмен данными нужно организовывать явно.
  • multiprocessing полезен для CPU-bound задач, где нужен реальный параллелизм.
  • Для передачи данных между процессами часто используют Queue и Pipe.
  • Для синхронизации применяют Lock, Event, Semaphore, Condition.
  • Общую память используют осторожно: нужны синхронизация и контроль гонок.
  • На собеседовании важно показать не только запуск процессов, но и понимание их жизненного цикла, ошибок и стоимости IPC.