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

Delvig

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

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

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

Хотел переписать этот блок шаблона полностью на шарпе (типа работает быстрее чем кубики), но по идее смысла нет, ведь проблема в самой таблице привязанной к файлу.
Подскажите как лучше можно решить мою задачу?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
данные не просто медленно скидываются в таблицу, а ооооочень медленно.
пробовать лочить таблицу на время записи ?
вот кстати первый вариант прям норм смотрится. на каждую проксю свой поток и своя таблица/запись в таблице. никаких пересечений. то что надо "много" делать шаблонов в зенке... ну это все условности...
у меня щас 80 шаблонов так работают. удобно мониторить что там твориться отдельно на каждом. остановить можно любое количество в нужный момент. ну плюшек мне кажется больше чем разгребать кучу в многопотоке.
обновлять шабы тоже просто , я первый шаб редактирую а потом отдельной обработкой копирую его в другие. работы на 2 клика :-)
я щас такой формат в таблице аккаунтов использую, у каждого аккаунта завел поле Прокси там храню ID записи прокси, а сами прокси в другой табличке записаны. Еще есть табличка где прописаны соответствия номеров потоков и закрепленных за ними прокси. в результате каждый поток при запуске по своему номеру вычисляет номер ID прокси, по ID прокси получает все аккаунты привязанные к этому прокси , ну и поехал работать с акками. никаких пересечений. удобненько, можно легко останавливать проблемный поток не в ущерб остальным. легко перевести аккаунты с одного прокси на другой, все наглядно :-)
 
  • Спасибо
Реакции: Delvig

Delvig

Client
Регистрация
07.09.2016
Сообщения
132
Благодарностей
131
Баллы
43
Не понятно нахрена я задавал вопрос выше, но ладно пусть лежит вдруг пригодятся мои мытарства кому-то. Задачу решил. надо просто брать строку с удалением, а в конце выполнения шаблона просто записывать ее обратно. Видимо шпионы проскакивали именно в момент, взятия строки, когда еще ни один из потоков не успел записать статус в ячейку.
 

Delvig

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

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

C ID прям база данных получается. =)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Доля истины в Ваших словах есть, следить за работой потоков действительно в каждой отдельной копии шаблона действительно удобнее. А то когда все в кучу попробуй сообрази какой поток в данный момент успешно закончил, а какой только начался. =)

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Не понятно нахрена я задавал вопрос выше, но ладно пусть лежит вдруг пригодятся мои мытарства кому-то. Задачу решил. надо просто брать строку с удалением, а в конце выполнения шаблона просто записывать ее обратно. Видимо шпионы проскакивали именно в момент, взятия строки, когда еще ни один из потоков не успел записать статус в ячейку.
с увеличением количества аккаунтов и прокси такие колизии будут происходить все чаще. раз уж на 2 прокси наблюдаются такие проблемы то при маштабировании все может полететь в тартарары . тут как бы на начальной стадии надо это исключать.
 

Delvig

Client
Регистрация
07.09.2016
Сообщения
132
Благодарностей
131
Баллы
43
с увеличением количества аккаунтов и прокси такие колизии будут происходить все чаще. раз уж на 2 прокси наблюдаются такие проблемы то при маштабировании все может полететь в тартарары . тут как бы на начальной стадии надо это исключать.
Не, вроде нормально все, запустил на 2 прокси 8 потоков и все ок. Мы же из таблицы данные так же берем, с удалением. И проблемы не возникают. Хз зачем я изначально начал мудрить с получением и обработкой данных в несколько этапов.

Но похоже действительно лучше раскинуть на разные копии, т.к. даже в 8 потоков набивается акков с одной проксей и вторая простаивает.
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
чот я туплю что ли.... понять не могу 2 прокси 8 потоков.... как 8 потоков могут юзать 2 прокси одновременно ? уже 3й поток полюбому возьмет в исполнение одну из проксей что используются в 1м и 2м потоке. и получается 2 разных аккаунта будут одновременно работать с одним IP ? так ? или я чего то не уловил ?
 

Delvig

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Так в том и суть задачи была, что бы поток не мог взять занятую проксю. В таблице с аккаунтами акки лежат в перемешку, бывает подряд с одной проксей и по 5-6 штук идет. Шаб в 8 потоков (хотя сейчас 10 сделал) берет по строке из таблицы с акками. Каждый поток пытается взять из таблицы, в которой лежит 2 строки - 2 айпи модемов, строку содержащую соответстующий айпи. Если он ее получает (с удалением естественно), то он уже продолжает работать, т.е. передергивает модем и дальше выполняет работу. Если же в таблице пусто, то экшен вываливается с ошибкой и идет на паузу, после которой опять пробует получить строку из таблицы. А в конце работы шаблона или если произошел badend строка с айпи обратно записывается в табличку, где эту строку тут же подхватывает ожидающий поток. Т.е. одновременно работу выполняет только 2 потока, остальные в ожидании.
проще сделать всего 2 потока, каждому назначить свой прокси, аккаунтам присвоить в табличке прокси и все проблемы сразу отпадут.
шаблон стартует, передергивает модем, находит в общей таблицы аккаунт с прокси соответсвующий его настройки, строчку удаляет, записывает в конец таблицы, работает и выходит.
ни пересечений, ни колизий, ни перерасхода памяти на непонятные висящие потоки которые ничего не делают.
если проблема найти нужную строку , так не беда это быстро варганиться :-)
 
  • Спасибо
Реакции: Delvig и backoff

Delvig

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Вот это хорошее решение. Надо переписать шаб. Проблем с написанием поиска нужной строки нет. Да по идее даже писать ничего не надо, можно использовать кубик "взять строку из таблицы содержащую текст" и брать первый найденный элемент.
кубики сила ! :-)
 

Delvig

Client
Регистрация
07.09.2016
Сообщения
132
Благодарностей
131
Баллы
43
проще сделать всего 2 потока, каждому назначить свой прокси, аккаунтам присвоить в табличке прокси и все проблемы сразу отпадут.
шаблон стартует, передергивает модем, находит в общей таблицы аккаунт с прокси соответсвующий его настройки, строчку удаляет, записывает в конец таблицы, работает и выходит.
ни пересечений, ни колизий, ни перерасхода памяти на непонятные висящие потоки которые ничего не делают.
если проблема найти нужную строку , так не беда это быстро варганиться :-)
Оказалось, что решение не без изъяна. Т.к. прокси работают с разной скоростью, то получается что один поток работает быстрее. И когда этот один поток пройдет все соответствующие ему акки, он начнет брать их по кругу. Т.е. у меня допустим 100 акков по 50 на каждую проксю. Запускаю шаблон на 100 выполнений. Один поток пройдет свои 50, а у другого к этому времени будет только 30. И первый начнет обрабатывать повторно уже отработанные акки, а второй так и не отработает свои 50. Поэтому тут еще надо делать какую-то метку для каждого акка, можно в принципе текущую дату записывать по выполнении.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
в идеале нужен диспетчер, который управляет рабочими шаблонами. диспетчер выполняется постоянно , бесконечно. он всегда знает какой шаблон и когда надо запустить, а какой поток придержать. я щас без диспетчера как без рук.
 
  • Спасибо
Реакции: Konrod_m

Delvig

Client
Регистрация
07.09.2016
Сообщения
132
Благодарностей
131
Баллы
43
в идеале нужен диспетчер, который управляет рабочими шаблонами. диспетчер выполняется постоянно , бесконечно. он всегда знает какой шаблон и когда надо запустить, а какой поток придержать. я щас без диспетчера как без рук.
Диспетчер - это по сути шаблон, который управляет шаблонами, правильно? Или имеется в виду встроенный "диспетчер заданий"? Как можно придержать поток?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Диспетчер - это по сути шаблон, который управляет шаблонами, правильно? Или имеется в виду встроенный "диспетчер заданий"? Как можно придержать поток?
Да все верно, шаблон без браузера. я там реализую логику гибкого расписания для рабочих шаблонов. у меня для каждого аккаунта плавающее расписание , вот диспетчер делает выборку доступных для работы аккаунтов и запускает нужный шаблон или не запускает. дополнительно еще мониторит все шаблоны на таймаут.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Придержать поток ? ммм ну можно не запускать его :-) я потоки запускаю в 1 попытку. в диспетчере происходит проверка работает щас рабочий шаблон или нет. и запуск делается только свободные шаблоны.
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Все прокси в таблицу или в БД и каждой прокси статус: занято-свободно, поток перебрал прокси, взял свободную и сразу поменял статус на занято, следующий поток ждет пока освободится прокси, например чекает каждые 1-2 минуты, можно добавить ячейку/поле с указанием сколько на одну прокси можно вешать аккаунтов...
 
Последнее редактирование:

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
Если правильно понял, можно сделать проще:
Завести список занятых прокси, поток берёт по очереди аккаунты, проверяя наличие у них прокси в занятых, отправляет в работу или проверяет следующий акк.
Если акк без прокси, то берёт свободный, но тут лучше сделать учёт кол-ва использования прокси (в таблице), что бы распределялось на все (но это больше для обычных проксей).
 
  • Спасибо
Реакции: Koqpe

Viking01

Client
Регистрация
19.08.2017
Сообщения
228
Благодарностей
151
Баллы
43
Все гораздо проще, если я правильно понял проблему - чтобы к каждому аккаунту бралась прокся и никто ее больше не использовал пока она занята.

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

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Все гораздо проще, если я правильно понял проблему - чтобы к каждому аккаунту бралась прокся и никто ее больше не использовал пока она занята.

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

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

Viking01

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
конечно нет.
потому что 100 акков - предполагаю что потоки имеются ввиду - я бы не запускал с 2х модемов))
насчет 30%-40% - таблица же лочится.
Да лочить надо, но в вашем описания решения проблемы , отсутствует это. Вы же понимаете что зеннопостер сам не лочит ничего :bh:
 

DocSpoc

Client
Регистрация
04.01.2016
Сообщения
288
Благодарностей
169
Баллы
43
Скажите, пожалуйста, а в чем преимущество таблицы перед списком?
Я имею ввиду, что можно делать то же самое читая/записывая список.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
  • Спасибо
Реакции: DocSpoc

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