Покрытие кода Python и многопроцессорность

Я использую coveralls в сочетании с coverage.py для отслеживания покрытия кода моего скрипта. Я использую следующие команды:

coverage run --parallel-mode --source=mysource --omit=*/stuff/idont/need.py ./mysource/tests/run_all_tests.py
coverage combine
coveralls --verbose

Это работает довольно хорошо, за исключением multiprocessing. Код, выполняемый пулами работников или дочерними процессами, не отслеживается.

Есть ли возможность отслеживать многопроцессорный код? Какой-то конкретный вариант мне не хватает? Может быть, добавление оберток в библиотеку многопроцессорности для запуска покрытия каждый раз, когда создается новый процесс?

ИЗМЕНИТЬ

I (и jonrsharpe, также:-) нашел обезьяна-патч для многопроцессорности.

Однако это не работает для меня, моя Tracis-CI build убивается почти сразу после начала. Я проверил проблему на своей локальной машине и, по-видимому, добавил патч к многопроцессорной работе, разоряя мою память. Тесты, которые занимают менее 1 ГБ памяти, нуждаются в более чем 16 ГБ с этим исправлением.

EDIT2

Обезьяна-патч работает после небольшой модификации: Удаление анализ config_file (config_file=os.environ['COVERAGE_PROCESS_START']) сделал трюк. Это решило проблему раздутой памяти. Соответственно, соответствующая строка просто становится:

cov = coverage(data_suffix=True)

Ответ 1

Coverage 4.0 включает параметр командной строки --concurrency=multiprocessing, чтобы справиться с этим. Вы должны использовать coverage combine позже. Например, если ваши тесты находятся в regression_tests.py, вы просто сделаете это в командной строке:

coverage run --concurrency=multiprocessing regression_tests.py
coverage combine

Ответ 2

Я потратил некоторое время на то, чтобы убедиться, что покрытие работает с multiprocessing.Pool, но оно никогда не срабатывало.

Наконец-то я сделал исправление, которое заставляет его работать - было бы счастливо, если бы кто-то направил меня, если я что-то делаю неправильно.

https://gist.github.com/andreycizov/ee59806a3ac6955c127e511c5e84d2b6