Параллелизм в Go тестах: все, что нужно знать о -p, -parallel и t.Parallel()
- пятница, 14 февраля 2025 г. в 00:00:05
В Go есть три способа управления параллельностью тестов:
Флаг -p
Флаг -parallel
Вызов функции t.Parallel()
Но многие ли понимают, как они работают? И зачем нам все три?
Оказывается:
-p
управляет числом тестовых пакетов, выполняемых параллельно.
-parallel
определяет количество тестовых функций внутри одного пакета, выполняемых параллельно.
t.Parallel()
помечает тестовую функцию, разрешая Go выполнять её параллельно с другими тестами в том же пакете.
Допустим, у нас есть 999 пакетов, в каждом из которых 999 тестовых функций, но ни одна из них не использует t.Parallel()
. Что произойдет?
Ответ: N тестовых пакетов будет выполняться параллельно (N равно количеству ядер CPU), но внутри каждого пакета тесты будут запускаться последовательно. В итоге одновременно выполняются N тестов.
Теперь тот же сценарий, но добавим -p 1
. Что изменится?
Ответ: полностью последовательное выполнение тестов.
А теперь добавим t.Parallel()
, оставив -p 1
. Что будет?
Ответ: t.Parallel()
в сочетании с -p 1
означает "в каждый момент времени выполняется только один пакет, но внутри него N тестов могут выполняться параллельно", где N — количество ядер CPU.
Максимальный контроль достигается комбинацией всех трёх параметров: -p X -parallel Y + t.Parallel()
.
Но будьте осторожны с состоянием в тестах (как всегда, state — корень всех проблем, но без него не обойтись).
Разрабатываете на Go? Обратите внимание на Nevalang — экспериментальный язык программирования, построенный на основе Go, который решает некоторые его проблемы: гонки данных, nil pointer dereference и многое другое. В 2025 году он получит визуальный редактор, Rust-подобные enum'ы и многое другое. В перспективе Neva и Go смогут вызывать друг друга.
Заинтересовало? Поставьте ⭐ и присоединяйтесь к нашему сообществу. Нам нужны разработчики (не только gophers!) для тестирования и улучшения языка. Давайте вместе менять программирование! Go — классный, но можно сделать лучше: