Хочется придти к структуре многопоточного приложения одного типа а не прыгать от одного к другому.
Мы сейчас берем за основу http клиент без браузера, много аккаунтов. Когда каждый аккаунт работает в один поток все просто:
берется акк из ресурса=>из соответствующего файла загружаются куки для него и применяются к http клиенту=>в бесконечный цикл помещается сначала установка проски и следом, скажем лайк аккаунтов пост запросом=>этот пост запрос оборачивается в игнорирование ошибок с увеличением счетчика=>после определенного числа ошибок меняем прокси, и так по кругу.
Такая структура проста, т.к. в каждом потоке у нас свои локальные переменные и на каждый акк мы создаем свой поток, где автономно идет работа, идет смена прокси, со своим индивидуальным для каждого акка счетчиком ошибок для смены прокси.
Главный вопрос в следующем: когда у нас каждый акк в 10 потоков лайкает, как это лучше обернуть, если акков 100. 100*10=1000 потоков на запросах.
Варианты:
1) Оставляем структуру как выше, делаем 1000 потоков, в файле с акками, просто дублируем до тех пор чтобы стало 1000 и работаем. В этом случае каждый акк будет крутиться в 10 независимых потоках, каждый со своим прокси, в случае переполныния счетчика ошибок прокси будет менятся в разных потоках. Мне бы так не хотелось, хотелось бы 1 акк-1 проски и пошел в 10 потоков работать, до тех пор пока счетчик ошибок прокси не заполнился, останавливаем все потоки, меняем прокси и продолжаем так же работу в 10 потоков.
2) Используем асинхронную функцию. Как правильно? Запускаем 100 потоков, в каждом потоке загружаем отдельный акк и потом его куки и другие данные передаем в асинхронную функцию через параметры, ставим в ней 10 потоков, ставим "не убивать поток а ждать по окончанию задачи" чтобы каждый раз куки не применять. Так? Тогда при работе БАС в 100 потоков, на каждый аккаунт будет по 10 потоков, на каждый основной поток будет свой [[THREADS_LIST]]. Они же пересекаться никак не будут? Как в эту структуру встроить счетчик ошибок для смены прокси?
3) Используем "запуск функции в несколько потоков". В 100 потоках загружаем куки и другие данные акков и складываем их в глобальную переменную в виде JSON строки, типа
{"vyadavs@mail.ru":"КУКИ"}
Вот как эти данные передать в многопоточную функцию, т.к. она на вход не принимает параметры, в отличие от асинхронной функции. Как сделать, чтобы допустим многопоточная функция, вызванная в 1 потоке использовала всегда одни данные, а вызванная в другом потоке всегда другие?
И какой в итоге способ самый оптимальный по производительности? Какие еще есть варианты работы 100 акков каждый в 10 потоков? Спасибо