Работа в многопотоке с мобильными прокси поднятыми на модемах

  • Автор темы Автор темы Delvig
  • Дата начала Дата начала

Delvig

Client
Регистрация
07.09.2016
Сообщения
134
Реакции
132
Баллы
43
Всем привет. Поднял на своем (физическом) сервере парочку мобильных проксей на 3g/4g модемах, на разных операторах. Скорость работы шаблона на каждом из операторов разная. Работаю с аккаунтами из таблицы, в таблицу записываю саму проксю и айпиху модема, для того что бы шаблон перед загрузкой страницы передергивал модем.
Возникла следующая проблема, т.к. я каждому аккаунту присваиваю свою проксю, и работаю только с ней, необходимо сделать так, что бы в многопотоке прокси не пересекались, т.е. не происходило такого, что бы 2 аккаунта сразу взяли одну и ту же проксю и каждый из них ее передернул. На мой взгляд есть 2 решения этой задачи: либо сделать несколько копий шаблона по числу таких проксей и запускать каждый из них в 1 потоке, либо сделать все в одном шаблоне, но нужна проверка на занятость прокси. Первый вариант, конечно же не вариант, т.к. 2-3 модема еще можно запускать несколько копий, а вот 10 модемов уже такое себе.

Поэтому рассмотрел несколько вариантов второго решения:
1 вариант. Тупо разложить акки в правильном порядке, идея херня, т.к. шаблон на разных операторах да и на одном отрабатывают с разной скоростью и в конечном итоге порядок собьется.
2 вариант. Реализация именно проверки на занятость прокси. Решил сделать таблицу в которой в одном столбце прописал ip модемов, а во втором статус, таблица привязывается к файлу. Шаблон работает по следующей логике: берется аккаунт обычным зенковским кубиком ищу строку в таблице содержащую текст (ip модема) и сохраняю значение статуса в переменную. Следующим кубиком проверяю соответствует ли эта переменная статусу свободной прокси и если да, то уже шарпом записываю в нужную ячейку статус занятости, а дальше шаб работает в штатном режиме, передергиват проксю и делает хорошие дела. Если же нет, то следует пауза 5-6 секунд и опять повторяю кубик зенковский куб работы с таблицей. Выглядит это так 43988

Т.е. по моей логике, из-за того, что в таблице аккаунты с разными проксями не чередуются по очереди, а могут идти подряд несколько штук, такой шаблон запущенный в количестве потоков превышающих количество проксей, все будет нормально работать, т.е. акки будут просто висеть в ожидании пока освободится прокся. На деле оказалось не так, почему-то после некоторого количества выполнений все же в разных потоках запускается одна и та же прокся. Такое может произойти только в том случае если одновременно 2 и более аккаунтов получают статус прокси, что она свободна, но понятие "одновременно" относительно. Я начиная работать с зенкой усвоил главный урок, что привязка таблицы к файлу позволяет работать в многопотоке и не будет возникать проблем с перезаписыванием данных. Оказывается данные записываются в файл из привязанной таблицы не достаточно быстро.

Хотел переписать этот блок шаблона полностью на шарпе (типа работает быстрее чем кубики), но по идее смысла нет, ведь проблема в самой таблице привязанной к файлу.
Подскажите как лучше можно решить мою задачу?
 
данные не просто медленно скидываются в таблицу, а ооооочень медленно.
пробовать лочить таблицу на время записи ?
вот кстати первый вариант прям норм смотрится. на каждую проксю свой поток и своя таблица/запись в таблице. никаких пересечений. то что надо "много" делать шаблонов в зенке... ну это все условности...
у меня щас 80 шаблонов так работают. удобно мониторить что там твориться отдельно на каждом. остановить можно любое количество в нужный момент. ну плюшек мне кажется больше чем разгребать кучу в многопотоке.
обновлять шабы тоже просто , я первый шаб редактирую а потом отдельной обработкой копирую его в другие. работы на 2 клика :)
я щас такой формат в таблице аккаунтов использую, у каждого аккаунта завел поле Прокси там храню ID записи прокси, а сами прокси в другой табличке записаны. Еще есть табличка где прописаны соответствия номеров потоков и закрепленных за ними прокси. в результате каждый поток при запуске по своему номеру вычисляет номер ID прокси, по ID прокси получает все аккаунты привязанные к этому прокси , ну и поехал работать с акками. никаких пересечений. удобненько, можно легко останавливать проблемный поток не в ущерб остальным. легко перевести аккаунты с одного прокси на другой, все наглядно :)
 
  • Спасибо
Реакции: Delvig
Не понятно нахрена я задавал вопрос выше, но ладно пусть лежит вдруг пригодятся мои мытарства кому-то. Задачу решил. надо просто брать строку с удалением, а в конце выполнения шаблона просто записывать ее обратно. Видимо шпионы проскакивали именно в момент, взятия строки, когда еще ни один из потоков не успел записать статус в ячейку.
 
данные не просто медленно скидываются в таблицу, а ооооочень медленно.
пробовать лочить таблицу на время записи ?
вот кстати первый вариант прям норм смотрится. на каждую проксю свой поток и своя таблица/запись в таблице. никаких пересечений. то что надо "много" делать шаблонов в зенке... ну это все условности...
у меня щас 80 шаблонов так работают. удобно мониторить что там твориться отдельно на каждом. остановить можно любое количество в нужный момент. ну плюшек мне кажется больше чем разгребать кучу в многопотоке.
обновлять шабы тоже просто , я первый шаб редактирую а потом отдельной обработкой копирую его в другие. работы на 2 клика :-)
я щас такой формат в таблице аккаунтов использую, у каждого аккаунта завел поле Прокси там храню ID записи прокси, а сами прокси в другой табличке записаны. Еще есть табличка где прописаны соответствия номеров потоков и закрепленных за ними прокси. в результате каждый поток при запуске по своему номеру вычисляет номер ID прокси, по ID прокси получает все аккаунты привязанные к этому прокси , ну и поехал работать с акками. никаких пересечений. удобненько, можно легко останавливать проблемный поток не в ущерб остальным. легко перевести аккаунты с одного прокси на другой, все наглядно :-)
Доля истины в Ваших словах есть, следить за работой потоков действительно в каждой отдельной копии шаблона действительно удобнее. А то когда все в кучу попробуй сообрази какой поток в данный момент успешно закончил, а какой только начался. =)

Про отдельную обработку, в смысле специальный шаб который перезаписывает? Или что за обработка?

C ID прям база данных получается. =)
 
Доля истины в Ваших словах есть, следить за работой потоков действительно в каждой отдельной копии шаблона действительно удобнее. А то когда все в кучу попробуй сообрази какой поток в данный момент успешно закончил, а какой только начался. =)

Про отдельную обработку, в смысле специальный шаб который перезаписывает? Или что за обработка?
просто шаблон написал, без браузера. копирует определенный файл с прибавлением индекса в конце к названию.
 
Не понятно нахрена я задавал вопрос выше, но ладно пусть лежит вдруг пригодятся мои мытарства кому-то. Задачу решил. надо просто брать строку с удалением, а в конце выполнения шаблона просто записывать ее обратно. Видимо шпионы проскакивали именно в момент, взятия строки, когда еще ни один из потоков не успел записать статус в ячейку.
с увеличением количества аккаунтов и прокси такие колизии будут происходить все чаще. раз уж на 2 прокси наблюдаются такие проблемы то при маштабировании все может полететь в тартарары . тут как бы на начальной стадии надо это исключать.
 
с увеличением количества аккаунтов и прокси такие колизии будут происходить все чаще. раз уж на 2 прокси наблюдаются такие проблемы то при маштабировании все может полететь в тартарары . тут как бы на начальной стадии надо это исключать.
Не, вроде нормально все, запустил на 2 прокси 8 потоков и все ок. Мы же из таблицы данные так же берем, с удалением. И проблемы не возникают. Хз зачем я изначально начал мудрить с получением и обработкой данных в несколько этапов.

Но похоже действительно лучше раскинуть на разные копии, т.к. даже в 8 потоков набивается акков с одной проксей и вторая простаивает.
 
Последнее редактирование:
чот я туплю что ли.... понять не могу 2 прокси 8 потоков.... как 8 потоков могут юзать 2 прокси одновременно ? уже 3й поток полюбому возьмет в исполнение одну из проксей что используются в 1м и 2м потоке. и получается 2 разных аккаунта будут одновременно работать с одним IP ? так ? или я чего то не уловил ?
 
чот я туплю что ли.... понять не могу 2 прокси 8 потоков.... как 8 потоков могут юзать 2 прокси одновременно ? уже 3й поток полюбому возьмет в исполнение одну из проксей что используются в 1м и 2м потоке. и получается 2 разных аккаунта будут одновременно работать с одним IP ? так ? или я чего то не уловил ?
Так в том и суть задачи была, что бы поток не мог взять занятую проксю. В таблице с аккаунтами акки лежат в перемешку, бывает подряд с одной проксей и по 5-6 штук идет. Шаб в 8 потоков (хотя сейчас 10 сделал) берет по строке из таблицы с акками. Каждый поток пытается взять из таблицы, в которой лежит 2 строки - 2 айпи модемов, строку содержащую соответстующий айпи. Если он ее получает (с удалением естественно), то он уже продолжает работать, т.е. передергивает модем и дальше выполняет работу. Если же в таблице пусто, то экшен вываливается с ошибкой и идет на паузу, после которой опять пробует получить строку из таблицы. А в конце работы шаблона или если произошел badend строка с айпи обратно записывается в табличку, где эту строку тут же подхватывает ожидающий поток. Т.е. одновременно работу выполняет только 2 потока, остальные в ожидании.
 
Так в том и суть задачи была, что бы поток не мог взять занятую проксю. В таблице с аккаунтами акки лежат в перемешку, бывает подряд с одной проксей и по 5-6 штук идет. Шаб в 8 потоков (хотя сейчас 10 сделал) берет по строке из таблицы с акками. Каждый поток пытается взять из таблицы, в которой лежит 2 строки - 2 айпи модемов, строку содержащую соответстующий айпи. Если он ее получает (с удалением естественно), то он уже продолжает работать, т.е. передергивает модем и дальше выполняет работу. Если же в таблице пусто, то экшен вываливается с ошибкой и идет на паузу, после которой опять пробует получить строку из таблицы. А в конце работы шаблона или если произошел badend строка с айпи обратно записывается в табличку, где эту строку тут же подхватывает ожидающий поток. Т.е. одновременно работу выполняет только 2 потока, остальные в ожидании.

проще сделать всего 2 потока, каждому назначить свой прокси, аккаунтам присвоить в табличке прокси и все проблемы сразу отпадут.
шаблон стартует, передергивает модем, находит в общей таблицы аккаунт с прокси соответсвующий его настройки, строчку удаляет, записывает в конец таблицы, работает и выходит.
ни пересечений, ни колизий, ни перерасхода памяти на непонятные висящие потоки которые ничего не делают.
если проблема найти нужную строку , так не беда это быстро варганиться :)
 
  • Спасибо
Реакции: Delvig и backoff
проще сделать всего 2 потока, каждому назначить свой прокси, аккаунтам присвоить в табличке прокси и все проблемы сразу отпадут.
шаблон стартует, передергивает модем, находит в общей таблицы аккаунт с прокси соответсвующий его настройки, строчку удаляет, записывает в конец таблицы, работает и выходит.
ни пересечений, ни колизий, ни перерасхода памяти на непонятные висящие потоки которые ничего не делают.
если проблема найти нужную строку , так не беда это быстро варганиться :-)
Вот это хорошее решение. Надо переписать шаб. Проблем с написанием поиска нужной строки нет. Да по идее даже писать ничего не надо, можно использовать кубик "взять строку из таблицы содержащую текст" и брать первый найденный элемент.
 
Вот это хорошее решение. Надо переписать шаб. Проблем с написанием поиска нужной строки нет. Да по идее даже писать ничего не надо, можно использовать кубик "взять строку из таблицы содержащую текст" и брать первый найденный элемент.

кубики сила ! :)
 
проще сделать всего 2 потока, каждому назначить свой прокси, аккаунтам присвоить в табличке прокси и все проблемы сразу отпадут.
шаблон стартует, передергивает модем, находит в общей таблицы аккаунт с прокси соответсвующий его настройки, строчку удаляет, записывает в конец таблицы, работает и выходит.
ни пересечений, ни колизий, ни перерасхода памяти на непонятные висящие потоки которые ничего не делают.
если проблема найти нужную строку , так не беда это быстро варганиться :-)
Оказалось, что решение не без изъяна. Т.к. прокси работают с разной скоростью, то получается что один поток работает быстрее. И когда этот один поток пройдет все соответствующие ему акки, он начнет брать их по кругу. Т.е. у меня допустим 100 акков по 50 на каждую проксю. Запускаю шаблон на 100 выполнений. Один поток пройдет свои 50, а у другого к этому времени будет только 30. И первый начнет обрабатывать повторно уже отработанные акки, а второй так и не отработает свои 50. Поэтому тут еще надо делать какую-то метку для каждого акка, можно в принципе текущую дату записывать по выполнении.
 
в идеале нужен диспетчер, который управляет рабочими шаблонами. диспетчер выполняется постоянно , бесконечно. он всегда знает какой шаблон и когда надо запустить, а какой поток придержать. я щас без диспетчера как без рук.
 
  • Спасибо
Реакции: Konrod_m
в идеале нужен диспетчер, который управляет рабочими шаблонами. диспетчер выполняется постоянно , бесконечно. он всегда знает какой шаблон и когда надо запустить, а какой поток придержать. я щас без диспетчера как без рук.
Диспетчер - это по сути шаблон, который управляет шаблонами, правильно? Или имеется в виду встроенный "диспетчер заданий"? Как можно придержать поток?
 
Диспетчер - это по сути шаблон, который управляет шаблонами, правильно? Или имеется в виду встроенный "диспетчер заданий"? Как можно придержать поток?

Да все верно, шаблон без браузера. я там реализую логику гибкого расписания для рабочих шаблонов. у меня для каждого аккаунта плавающее расписание , вот диспетчер делает выборку доступных для работы аккаунтов и запускает нужный шаблон или не запускает. дополнительно еще мониторит все шаблоны на таймаут.
 
Придержать поток ? ммм ну можно не запускать его :) я потоки запускаю в 1 попытку. в диспетчере происходит проверка работает щас рабочий шаблон или нет. и запуск делается только свободные шаблоны.
 
Все прокси в таблицу или в БД и каждой прокси статус: занято-свободно, поток перебрал прокси, взял свободную и сразу поменял статус на занято, следующий поток ждет пока освободится прокси, например чекает каждые 1-2 минуты, можно добавить ячейку/поле с указанием сколько на одну прокси можно вешать аккаунтов...
 
Последнее редактирование:
Если правильно понял, можно сделать проще:
Завести список занятых прокси, поток берёт по очереди аккаунты, проверяя наличие у них прокси в занятых, отправляет в работу или проверяет следующий акк.
Если акк без прокси, то берёт свободный, но тут лучше сделать учёт кол-ва использования прокси (в таблице), что бы распределялось на все (но это больше для обычных проксей).
 
  • Спасибо
Реакции: Koqpe
Все гораздо проще, если я правильно понял проблему - чтобы к каждому аккаунту бралась прокся и никто ее больше не использовал пока она занята.

таблица Живые прокси.
перед началом работы - взять строку, удалить из таблицы...
… поработать...
… по окончании работы добавить прокси в конец таблицы.

две проверки:
- если таблица пуста (все прокси в работе) - цикл ожидания и повторной проверки. ну, банальная очередь.
- добавить кубик BadEnd - из него действие Добавить прокси в конец таблицы. То есть, если по какой-то причине шаблон вылетел до шага вернуть прокси в конец таблицы, то BadEnd это сделает.
 
Все гораздо проще, если я правильно понял проблему - чтобы к каждому аккаунту бралась прокся и никто ее больше не использовал пока она занята.

таблица Живые прокси.
перед началом работы - взять строку, удалить из таблицы...
… поработать...
… по окончании работы добавить прокси в конец таблицы.

две проверки:
- если таблица пуста (все прокси в работе) - цикл ожидания и повторной проверки. ну, банальная очередь.
- добавить кубик BadEnd - из него действие Добавить прокси в конец таблицы. То есть, если по какой-то причине шаблон вылетел до шага вернуть прокси в конец таблицы, то BadEnd это сделает.

прикольно. Вы сами так делали ? Работали в многопотоке хотя бы с 100 аккаунтами ?
у него 2 прокси и он одновременно запускал 6 шаблонов по первому варианту . да эту первую строку перед тем как она удалиться из таблицы успеет прочитать 30%-40% всех запущенных потоков.
 
прикольно. Вы сами так делали ? Работали в многопотоке хотя бы с 100 аккаунтами ?
у него 2 прокси и он одновременно запускал 6 шаблонов по первому варианту . да эту первую строку перед тем как она удалиться из таблицы успеет прочитать 30%-40% всех запущенных потоков.
конечно нет.
потому что 100 акков - предполагаю что потоки имеются ввиду - я бы не запускал с 2х модемов))
насчет 30%-40% - таблица же лочится.
 
конечно нет.
потому что 100 акков - предполагаю что потоки имеются ввиду - я бы не запускал с 2х модемов))
насчет 30%-40% - таблица же лочится.

Да лочить надо, но в вашем описания решения проблемы , отсутствует это. Вы же понимаете что зеннопостер сам не лочит ничего :bh:
 
Скажите, пожалуйста, а в чем преимущество таблицы перед списком?
Я имею ввиду, что можно делать то же самое читая/записывая список.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)