LINUX.ORG.RU

Многопоточное программирование в Python

 , ,


3

5

Всем доброго дня.

Хотел узнать, как правильно многопоточно программировать в Python. Мне необходимо параллельно запускать кучу тестов Selenium. Как я делаю сейчас - у меня есть отдельный скрипт, который принимает аргументы из sys.argv от программы вышестоящей(которая собирает Pool, делает map_async, и открывает через subprocess новый процесс интерпретатора Пайтона).

То есть схема примерно получается такая:

Основное приложение - Thread на вызов клиента - Pool - в одном потоке Пула вызывается subprocess - subprocess открывает новый интерпретатор Пайтона, который выполняет нужную мне программу.

Таким образом я могу запускать 100-200 тестов, перехватывать stdout и stderr программ-тестов, и вообще не особо париться. Но проблема только в том, что Pool как-то нестабильно работает. Допустим, у меня есть Pool на 100 потоков, есть инфа, 70к записей, по которой нужно сделать map, то есть передать параметры в реальный тест. Но иногда Pool зависает, не запускает больше потоков, либо держит включёнными только 2-3(может чуть больше), хотя в параметрах указано явно 100.

В общем хотел узнать, какой есть стабильный вариант многопоточного программирования в Python. И по тому что я сказал, мне нужна больше не функциональность многопоточного программирования, а уже видимо что-то типа nohup, но с контролем количества процессов.

Извиняюсь заранее за скомканное изложение, если что-то непонятно - пишите.

P.S. Прямой вызов функций из Pool я перестал юзать после того как неосилил исключения, которые вроде как и есть, но их не видно и вообще пофиг. С отдельным скриптом я многое сумел побороть, и это наиболее удобный для меня вариант получился.

Но иногда Pool зависает, не запускает больше потоков, либо держит включёнными только 2-3(может чуть больше), хотя в параметрах указано явно 100.

как думаешь почему?

umren ★★★★★ ()

в одном потоке Пула вызывается subprocess - subprocess открывает новый интерпретатор Пайтона, который выполняет нужную мне программу.

сделай вдоль. или перепиши нормально

i_gnatenko_brain ★★★★ ()
Ответ на: комментарий от umren

Потому что криворукий? :) Хз. Запуск пула - пара команд, а почему зависает - не ясно.

mahalaka ★★ ()
Ответ на: комментарий от i_gnatenko_brain

«Нормально» - это как? Я бы хотел знать как нормально, но приходится делать так, как получается :)

mahalaka ★★ ()
Ответ на: комментарий от umren

Ну вообще постоянно работает всё ок, и как мне надо. Через некоторое время, допустим через дня два выполнения программы - Pool начинает тупить.

gIiIjony ()
Ответ на: комментарий от umren

Ну и вообще - хотелось бы конструктива. Другого достаточно стабильного варианта, чтобы запускать сотню браузеров, и чтобы у каждого было своё окружение, место где будет крутиться вся логика - я не вижу, по крайней мере сейчас в Пайтоне. Если я не прав - прошу пнуть меня в правильную сторону, т.к. через долгое время мучений и попыток понять «как сделать» я именно пришёл к ответу в виде subprocess и Pool.

gIiIjony ()
Ответ на: комментарий от anonymous

Не совсем понял - «для автоматизации»? Для автоматизации чего? Сейчас я использую Pool как раз из multiprocessing.

Моя задача - это поставить в очередь выполнения n-ное количество запросов, ограничить это «количеством процессов»(т.е. одновременных выполнений). Pool с этим прекрасно справляется, но как я и писал - через некоторое время ведёт себя странно по непонятным причинам. Думаю это из-за того что некоторые процессы отваливаются, и остаются зомби-браузеры висеть, без родителя. Знающие, можете ли сказать, возможна такая ситуация?

gIiIjony ()
Ответ на: комментарий от gIiIjony

Думаю это из-за того что некоторые процессы отваливаются, и остаются зомби-браузеры висеть, без родителя. Знающие, можете ли сказать, возможна такая ситуация?

Возьми да посмотри.

SystemD-hater ()
Ответ на: комментарий от SystemD-hater

Спасибо за помощь. :) Можно вообще всё изучить, перечитать код multiprocessing, но может что-то изобрели уже до меня :)

Да и со ста процессов Пайтона зомби-браузеров у меня остаётся парочка, разве они могут влиять?

gIiIjony ()

для многопоточности у питонистов есть golang

qulinxao ★★☆ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.