Оптимальная организация многопоточной работы



  • Хочется придти к структуре многопоточного приложения одного типа а не прыгать от одного к другому.

    Мы сейчас берем за основу 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 потоков, которые остаются в этом потоке неизменные, до тех пор, пока количество ошибок не превысит предел, потом идет новая настройка потоков и рассылка по кругу.

    Как делаете вы? Не прошу конкретные сайты, партнерки и прочее, ваш хлеб я точно не съем. Может моя логика не оптимальная и можно сделать лучше?


Log in to reply
 

  • 2
  • 8
  • 2
  • 2
  • 6
  • 9
  • 2
  • 5