Но появилась новая проблема. Иногда скрипт во время работы внезапно запрещает выделять действия. Т.е при клике на любое действие, оно просто не выделяется красным. Это второй баг, независимый от первого если что
Оптимальная организация многопоточной работы
-
Хочется придти к структуре многопоточного приложения одного типа а не прыгать от одного к другому.
Мы сейчас берем за основу 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 потоков? Спасибо
-
Блин, ну хоть бы кто то ответил... Сторожилы, @Fox , @UserTrue , @FastSpace где же вы? Вот как я сейчас сделал:
Есть 100 акков, на каждый акк запускаем по потоку, в каждом потоке, данные от акка подаются в асинхронную функцию, которая в 10 потоках устанавлевает куки, и юзерагент от аккаунта. В настройках этой функции стоит "false" на закрытие потока после завершения функции и "wait" на "Поведение во время бездействия потока". Далее ждем завершения работы асинхронной функции. Теперь создаем цикл foreach по циклу потоков, в которых уже настроенные http клиенты ждут задач. Запускаем функцию по лайкам, на вход в "Желаемый ID потока" идут id из [[FOREACH_DATA]] списка потоков. В этой функции идут уже запросы, без установки параметров браузера, все уже настроено в этих потоках. Также прикрутил счетчик, который периодически ожидает выполнение асинхронной функции по рассылке, и если количество неудачных выполнений функции больше определенного количества, то потоки убиваются и по метке скрипт возвращается в установку прокси и других параметров. Это на случай, если в процессе работы прокси испортится. Пока этот момент с ошибками не протестил. Т.е. суть такая, что при запуске 100 потоков, в каждом запускается по 10 потоков, которые остаются в этом потоке неизменные, до тех пор, пока количество ошибок не превысит предел, потом идет новая настройка потоков и рассылка по кругу.Как делаете вы? Не прошу конкретные сайты, партнерки и прочее, ваш хлеб я точно не съем. Может моя логика не оптимальная и можно сделать лучше?