Всем добрый день. Пишу парсер сайта, который должен обходить 60 тыс. страниц с карточками товара и собирать с них нужные атрибуты. Использую список из 16 тыс. прокси и 1 тыс. юзер-агентов, из которых выбираю сочетание случайным образом. Если ответа нет в течение 5 секунд, то беру следующий прокси. В среднем 1 из 5 раз удается получить страницу. Основное время, как я понимаю, уходит на ожидание ответа страницы. Результаты пишу в CSV.
Вопрос 1.
Сейчас делаю всё в 100 потоков через мультипроцессинг. Занимает около 4 Гб оперативной памяти.
Имеет ли смысл использовать мультипоточность? Или может быть стоит сделать мультипоточность внутри мультипроцессинга? Есть ли разница?
Вопрос 2.
При записи в CSV часть строк получаются кривые, попадает только часть фразы из поля. Такое впечатление, что процессы конфликтуют между собой при записи в один и тот же файл. Может ли действительно быть такое и как это исправить?
Вопрос 3.
Как сделать так, чтобы разные процессы обменивались между собой переменными? Например, сделать единый счетчик кол-во обработанных страниц, т.е. чтобы разные процессы увеличивали переменную на +1. Сейчас получается, что в каждом процессе своя переменная (делаю через Global).
Вопрос 4.
Как правильно писать результаты в БД? Если делать в лоб, то могу после парсинга каждой страницы открывать соединение, запускать нужный курсор, делать комит и закрывать соединение. Но наверное это не очень оптимально. Можно ли открыть одно соединение на все процессы/потоки и писать результаты в одну таблицу?
Заранее спасибо за ответы и советы.