Аккаунты в многопотоке

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
343
Благодарностей
207
Баллы
43
Крайне неудобное в ZP управление аккаунтами при работе нескольких потоков. Предлагается ставить флаг о том, что аккаунт взят в работу, чтобы следующий поток не взял тот же акк. А когда аккаунты заканчиваются - приходится вручную удалять флаги. Каждый шаблонописатель, кто на что горазд, выдумывает свой способ. Например, ставит рандомную паузу в начале, чтобы запущенные одновременно потоки не взяли один и тот же аккаунт. Или добавляет потоки по одному, т.к. рандомная пауза спасает не всегда!

Более того, в ZP невозможно закрыть поток или шаблон так, чтобы удалились и флаги. В итоге получается, что, к примеру, один поток работает, другой был закрыт, а флаги проставлены для обоих аккаунтов. И приходится либо закрывать всё нафиг, удалять все флаги, и запускать заново. Либо пытаться угадать какой же аккаунт в данный момент всё-таки не работает, лезть в файл-таблицу (или список), и удалять там соответствующую пометку-флаг. Геморрой ещё тот.

Как это реализовано в простых exe-программах? Там же нет такого, чтобы юзер лез в Program files, искал определённый файл, правил его, сохранял, и только после этого запускал прогу. Насколько я понимаю, в обычных прогах происходит примерно следующее: если в данный момент работают другие потоки, то проверяется, какие строки из БД там используются, после чего берётся ближайшая свободная строка... Ну а если потоков других нет - значит логично, что нужно брать первую строку. Неужели в ZP нельзя реализовать похожим образом?
 
Последнее редактирование:

Charodey

Client
Регистрация
16.11.2017
Сообщения
91
Благодарностей
3
Баллы
8
Проблема актуальна. Я чтобы включить 20 потоков сделал 20 разных шаблонов, берущих профили с 20 разных папок.
А если надо что-то изменить в шаблоне, то приходится изменять 20 раз
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 458
Благодарностей
8 682
Баллы
113
Проблема актуальна. Я чтобы включить 20 потоков сделал 20 разных шаблонов, берущих профили с 20 разных папок.
А если надо что-то изменить в шаблоне, то приходится изменять 20 раз
А зачем менять 20 раз?
Можно сделать изменения в одном шаблоне и скопировать его в 20 папок.
 

zortexx

Client
Регистрация
19.09.2011
Сообщения
2 520
Благодарностей
1 223
Баллы
113
Проблема в том, что отстутвуют официальные материалы Best Practices, и частенько юзерам приходится изобретать велосипед, вместо того чтобы прочитать как именно надо использовать программу.
Форум читают далеко не все :-)
 

Dimazzan

Client
Регистрация
05.11.2014
Сообщения
338
Благодарностей
126
Баллы
43
Берешь аккаунт из списка с удалением и кидаешь в конец списка. Не благодари.
 

default

Client
Регистрация
27.09.2018
Сообщения
127
Благодарностей
28
Баллы
28
Берешь аккаунт из списка с удалением и кидаешь в конец списка. Не благодари.
но единственный минус этого, что список вроде как привязан к файлу. а при начале работы, строка удаляется и из файла. И не факт, что шаблон отработает так, как нужно. Иногда хочется, чтобы строка удалилась лишь по окончанию работы шаблона.

Работа со списком с удалением строки - это по сути самое примитивное использование файла в многопотоке. Но вот чтобы строка удалялась в самом конце - это уже сложнее.
 

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
Но вот чтобы строка удалялась в самом конце - это уже сложнее.
Берете строку с удалением в переменную
В случае ошибки в шаблоне - вешаете на Bad End действие - записать в конец списка
 

default

Client
Регистрация
27.09.2018
Сообщения
127
Благодарностей
28
Баллы
28
Берете строку с удалением в переменную
В случае ошибки в шаблоне - вешаете на Bad End действие - записать в конец списка
окей, сервер/комп вырубило электричеством прямо во время выполнения в середине шаблона. и ценные данные про**ались
как мне еще объяснить, что удалять в самом конце имеет смысл?
винда крашнулась там, я не знаю, что угодно в общем. происходит что-либо подобное - строка исчезает бесследно. зенку даже оффнуть принудительно допустим(не знаю правда, делаются ли бэдэнды в таком случае)

upd. конечно можно совсем бред делать, подобия брать строку и писать её сразу же в левый файл(на всякий) - но это же гемор лишний. когда опять же, идеально было бы удаление в конце работы шаблона. чем потом рыться по файлам и выискивать(тратить время). а если у меня таких серваков дома штук 40? и все 40 сразу разом упали? мне по всем 40 сервакам лазать искать эти строки из миллионного списка?
 
Последнее редактирование:

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43

Dimazzan

Client
Регистрация
05.11.2014
Сообщения
338
Благодарностей
126
Баллы
43
но единственный минус этого, что список вроде как привязан к файлу. а при начале работы, строка удаляется и из файла
Именно по этому мы закидываем сразу в конец списка
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
но единственный минус этого, что список вроде как привязан к файлу. а при начале работы, строка удаляется и из файла. И не факт, что шаблон отработает так, как нужно. Иногда хочется, чтобы строка удалилась лишь по окончанию работы шаблона.
Значит по Good End удаляй строку и все. В твоем случае железобетонный метод. Пока шаб не отработал, строка не удалится.
 

default

Client
Регистрация
27.09.2018
Сообщения
127
Благодарностей
28
Баллы
28
Именно по этому мы закидываем сразу в конец списка
речь шла про многопоток. если я поставлю 300потоков(какие-нибудь запросы), а строк всего скажем 350-400. То с перемещением в конец списка, рано или поздно 1ый поток будет работать с "последней" строкой(которая по итогу станет уже не последней как понимаю из-за других потоков), которую возьмёт допустим 157ой поток, т.к. 1ый поток еще не закончит выполнять шаблон(т.к. время выполнения может зависеть от многих факторов, капчи и прочего). И в итоге с одной строкой уже начнут работать 2-3-4-5 потоков и тд, не? Или я не так всё представляю? Сложно я конечно наверное объясняю, куча скобок и тд.
Значит по Good End удаляй строку и все. В твоем случае железобетонный метод. Пока шаб не отработал, строка не удалится.
выше сказал вроде, я хз как это реализовывается в многопотоке(точнее будет ли нормально. в чем сомневаюсь конечно). просто во всех указанных способах на мой взгляд потоки начнут хватать одну и ту же строку рано или поздно. типо ну удалю я в конце шаблона(я смогу это сделать), а как сделать, чтобы второй-третий поток не взяли эту же строку во время выполнения шаблона первым потоком? Просто данный способ на мой взгляд только для одного потока подходит, ну либо с какими-то дополнениями.

Я вообще представляю идеальную работу многопотока так:
1)одна строка используется только одним потоком и не более(второй поток не может её попросту взять, подобие или есть "lock" - я не знаю сам.)
2)удаление строки в конце работы шаблона.
Я хз, подходит ли хоть одно из решений написанных выше под мои параметры(хотелки).
 
Последнее редактирование:

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
речь шла про многопоток. если я поставлю 300потоков(какие-нибудь запросы), а строк всего скажем 350-400. То с перемещением в конец списка, рано или поздно 1ый поток будет работать с "последней" строкой(которая по итогу станет уже не последней как понимаю из-за других потоков), которую возьмёт допустим 157ой поток, т.к. 1ый поток еще не закончит выполнять шаблон(т.к. время выполнения может зависеть от многих факторов, капчи и прочего). И в итоге с одной строкой уже начнут работать 2-3-4-5 потоков и тд, не? Или я не так всё представляю? Сложно я конечно наверное объясняю, куча скобок и тд.
Для этого создается второй список, в котором аккаунты в работе. После того как шаблон берет аккаунт, он чекает его наличие во втором списке. Вобщем блеклист для аккаунтов. Метод рабочий и в многопотоке будет работать без проблем, снипет дам если надо, я лично использую его для прокси. Да и на списках в 400 потоков работать, это не самая лучшая идея. На таких объемах надо переходить на БД.
 
  • Спасибо
Реакции: material и default

inotoxic

Client
Регистрация
20.04.2015
Сообщения
354
Благодарностей
162
Баллы
43
Можно в рамках одного списка

Есть к примеру список на 5 строк
строки вида:

строка_1
строка_2
строка_3
строка_4
строка_5

В кубике создаем условие
взять строку НЕ содержащую текст "bussy" - с удалением

Получаем первую строку
из нее формируем строку вида
строка_1|bussy
добавляем в конец списка
и так для всех последующих строк

В итоге на 6 цикле - условие НЕ сработает - кубик выйдет по красной
Все строки обработаны и не потеряны
При многопотоке, каждый поток будет брать строки по условию
 

GoogleMo

Client
Регистрация
13.04.2014
Сообщения
223
Благодарностей
8
Баллы
18
Для этого создается второй список, в котором аккаунты в работе. После того как шаблон берет аккаунт, он чекает его наличие во втором списке. Вобщем блеклист для аккаунтов. Метод рабочий и в многопотоке будет работать без проблем, снипет дам если надо, я лично использую его для прокси. Да и на списках в 400 потоков работать, это не самая лучшая идея. На таких объемах надо переходить на БД.
Прошу сниппет, задался этим вопросом недавном у меня порядка 20-30акков в многопотоке работает и я понимаю, что с одним списком начнет "зажевывать".
 

Deniska

Client
Регистрация
20.07.2016
Сообщения
82
Благодарностей
5
Баллы
8
Берешь аккаунт из списка с удалением и кидаешь в конец списка. Не благодари.
+ Список с временем для следующего запуска, работаю несколько лет проблем не вызывает
В случае падения сервера и прочего, делается шаблон который быстро восстановит список аккаунтов из резервной копии, запускается один раз с остановкой всех остальных
 

GoogleMo

Client
Регистрация
13.04.2014
Сообщения
223
Благодарностей
8
Баллы
18
+ Список с временем для следующего запуска, работаю несколько лет проблем не вызывает
В случае падения сервера и прочего, делается шаблон который быстро восстановит список аккаунтов из резервной копии, запускается один раз с остановкой всех остальных
Можно поподробней про список со временем?
 

Charodey

Client
Регистрация
16.11.2017
Сообщения
91
Благодарностей
3
Баллы
8
+ Список с временем для следующего запуска, работаю несколько лет проблем не вызывает
В случае падения сервера и прочего, делается шаблон который быстро восстановит список аккаунтов из резервной копии, запускается один раз с остановкой всех остальных
У меня один профиль работает около секунд 10, т.к через него нужно отправить несколько post запросов. Если сделать так, то один аккаунт может взяться несколько раз
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
343
Благодарностей
207
Баллы
43
Некоторые тут писали, мол брать из одного списка с удалением, чего-то добавлять, чего-то менять, перекладывать в другой список, делать отдельный шаблон для резервных копий и прочая белеберда... Ребят - вы как раз описываете то, о чем я говорил в самом начале: "кто на что горазд". Но это всё КОСТЫЛИ. Единственное правильное решение описано в сообщении #12: "Одна строка используется только одним потоком и не более. Второй поток не может её попросту взять". Но для этого разрабы должны это сделать.

На самом деле, ничего особо сложного в реализации нормальной работы многопотока нет. Как вариант: при создании шаблона добавляется опция типа Входящих настроек, в этой опции вбиваются строки либо указывается ссылка на txt-список. А в экшенах добавляется отдельный кубик для работы с данной опцией. В этом кубике прописывается логика взятия строк в работу (случайно, с первой, с последней, regex и тд...). При работе когда происходит выполнение данного кубика, он выдаёт соответствующую строку и БЛОКИРУЕТ её до тех пор, пока поток не завершится. ВСЁ, проблема была бы решена. Причём запускать можно было бы без рандомной паузы, сразу нужное кол-во потоков, а вышеописанная опция разруливала бы как надо, и выдавала каждому потоку по 1 отдельной строке. И удалять вручную не пришлось бы никакие флаги в списках.

Но... разрабы никогда этого не сделают, мотивируя, что есть более насущные проблемы. Оно может и правда, но для многих людей как раз необходимость чёткой отработки многопотока является важнейшей задачей. И таким людям приходится выдумывать костыли. Ибо списки работают криво. Множество раз уже сталкивался с ситуацией, когда по непонятной причине 5 потоков берут в работу одну и ту же строку/профиль, хотя в логике шаба чётко указана установка флага и проверка. В этом случае прерываешь шаб, удаляешь вручную флаги, запускаешь шаб сначала - и о чудо, может сработать как положено! А может и не сработать - как повезёт.
 
Последнее редактирование:

Deniska

Client
Регистрация
20.07.2016
Сообщения
82
Благодарностей
5
Баллы
8
Сколько раз в сутки запускается отдельный аккаунт?
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
343
Благодарностей
207
Баллы
43

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 719
Благодарностей
1 376
Баллы
113
Проблема совершенно надуманная.

1) берите строку не содержащую слово busy
2) генерите случайное число/строку (идентификатор взятой в работу строки) ... запоминаете его в перемнной.
3) сразу после того как взяли строку и сгенерили идентификатор, кладите взятую строку в конец списка с прибавлением к ней |busy-xxxxxxx (где xxxxxx это сгенерированный идентификатор)
4) когда поток сделал все что нужно удаляете из списка строку содержащую идентификатор
5) все описанное выше оберните в лок

Делов на 10 строк, а то и меньше ...
 
Последнее редактирование:
  • Спасибо
Реакции: one

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
Не обратил внимание, что сниппет просили. Держите

C#:
string nameRegexp = project.Variables["NAME"].Value; // NAME - название зенно переменной
IZennoList Names = project.Lists["FEMALE"];
Regex re = new Regex(nameRegexp, RegexOptions.IgnoreCase);
return Names.Any(item => re.IsMatch(item));
Тут есть шаблон в котором код используется.
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
343
Благодарностей
207
Баллы
43
Проблема совершенно надуманная.

1) берите строку не содержащую слово busy
2) генерите случайное число/строку (идентификатор взятой в работу строки) ... запоминаете его в перемнной.
3) сразу после того как взяли строку и сгенерили идентификатор, кладите взятую строку в конец списка с прибавлением к ней |busy-xxxxxxx (где xxxxxx это сгенерированный идентификатор)
4) когда поток сделал все что нужно удаляете из списка строку содержащую идентификатор
5) все описанное выше оберните в лок

Делов на 10 строк, а то и меньше ...
Прочитайте тему целиком, увидите доводы, и не только мои, почему проблема не надуманная.
Кстати, недавно делал шаблон клиенту. Он человек простой, ему надо чтоб нажал кнопочку - заработало. Нажал стоп - остановилось. Но зеннопостер этого не позволяет сделать. Не хватает функции, когда в шаблоне ставишь контрольную точку, и если при выполнении шаба нажимаешь стоп, то шаб доходит до контрольной точки и останавливается. Вот что спрашивается мешало разрабам сделать такую фишку? Элементарно же. НО НЕТ! Мы лёгких путей не ищем! Надо делать флаг! И попробуй простому клиенту объяснить, нафига он должен удалять файлик, вместо того, чтобы просто нажать стоп!

Тоже самое можно сказать и по теме топика. Приходится городить списки, и отмечать их в работе, вместо того, чтобы сделать как полагается (описано выше). Самое стрёмное, что костыли со списками не только неудобны, но и могут не срабатывать (тоже описал ситуацию выше, когда по непонятным причинам берётся в работу одна и та же строка разными потоками, хотя прописан чекер - он тупо не срабатывает)
 
Последнее редактирование:

Deniska

Client
Регистрация
20.07.2016
Сообщения
82
Благодарностей
5
Баллы
8
Это Вы мне? Не понял вопроса... какой отдельный?
меня устраивает, правда нельзя запустить сразу 100 потоков одновременно, но с запуском через каждые 1+ минут справляется
 

Вложения

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 719
Благодарностей
1 376
Баллы
113
Тоже самое можно сказать и по теме топика. Приходится городить списки, и отмечать их в работе, вместо того, чтобы сделать как полагается (описано выше). Самое стрёмное, что костыли со списками не только неудобны, но и могут не срабатывать (тоже описал ситуацию выше, когда по непонятным причинам берётся в работу одна и та же строка разными потоками, хотя прописан чекер - он тупо не срабатывает)
Где и какие костыли вы тут увидели? Это обычная работа со списками и не более. А то что у вас разные потоки берут одну строку - это исключительно от вашей неправильной организации многопоточности в шаблоне и только. При правильной организации все работает как надо!
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 328
Благодарностей
5 431
Баллы
113
@Arturs2006 Вы по итогу ситуацию так и не решили?
 

socsecret.ru

Client
Регистрация
30.09.2017
Сообщения
343
Благодарностей
207
Баллы
43
Где и какие костыли вы тут увидели? Это обычная работа со списками и не более. А то что у вас разные потоки берут одну строку - это исключительно от вашей неправильной организации многопоточности в шаблоне и только. При правильной организации все работает как надо!
Так можно хоть на что сказать: если ты специалист, умеешь всё быстро и правильно делать, то у тебя всё будет работать как надо. А при знании программирования ещё и ZennoPoster не нужен. Но мы здесь в основной массе любители, которым нужны простые решения.
@Arturs2006 Вы по итогу ситуацию так и не решили?
Типа решил. Но непонятно, почему такая ситуация вообще возникает. У меня есть список, содержащий строки, которые должны выделяться для каждого потока индивидуально. Чтобы это сделать, я создал второй список, и когда поток берёт строку из первого списка, он тут же вносит её во второй. Следующий поток опять берёт строку, и проверяет, есть ли она во втором списке. Если есть - берёт следующую строку из первого списка, и так далее... Вроде всё логично, тут и ошибиться-то сложно, всё должно работать. И работает! Но через раз. Запускаю шаблон, ожидаю несколько минут для верности, затем открываю второй список и вижу: в нём все строки одни и те же, а именно - первая строка из первого списка повторяется по количеству потоков. Т.е. чекер не работает, и в работу каждый раз берётся самая первая строка. И можно сказать, что я криво что-то сделал, но нет. Прерываю шаб, удаляю второй список, снова запускаю - работает! Потом снова может не работать... Думал, причина в том, что я запускаю потоки одновременно. Попробовал поставить рандомную паузу 0-60 секунд. Для нескольких потоков (5-10) этого более чем достаточно. Не помогло. Брать строку с удалением тоже не помогает, да и как бы разницы никакой не должно быть, что с удалением, что без - чекер-то должен в любом случае отрабатывать.

Решение было таковым. Я поставил в ZP максимальное кол-во одновременно работающих потоков для шаблона, но запускать начал не сразу все, а сначала 1, этот поток так же как и раньше берёт строку из первого списка, кладёт во второй, после чего bat-файлом добавляет 1 выполнение. Соответственно это выполнение запускает второй поток... И вот тогда чекер начал отрабатывать как положено! Причём даже если между добавлением выполнений пауза всего лишь 1 секунда.
Посему делаю вывод, что это глюк Зеннопостера. Ибо я ничего по сути не изменил, принцип взятия потоков в работу остался идентичен.

Конечно, наверняка существуют и другие способы. Возможно, работа через свой код C#, или ещё какие-нибудь хитрые перетасовки строк дадут лучший результат. Но... не должно такого быть. Зеннопостер для того и нужен людям, чтоб избегать всего этого гемора. И ДАЖЕ еслиб не было вышеописанного глюка, это всё равно неправильный принцип работы многопотока. Хотя бы потому, что приходится удалять список перед запуском шаблона. Возьмите практически любую exe-программу, которая тоже делает что-нибудь в несколько потоков. Вы там не увидите в инструкции пункт "удалите txt-файл перед запуском программы", а всё потому, что в нормальных программах отметка о взятии строки в работу осуществляется виртуально, а при закрытии программы отметки удаляются. А с Зеннопостером приходится клиентов пугать всеми этими манипуляциями.
 
Последнее редактирование:

one

Client
Регистрация
22.09.2015
Сообщения
6 793
Благодарностей
1 264
Баллы
113

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 719
Благодарностей
1 376
Баллы
113
А можно увидеть эти строки? Ну так, на будущее и для расширения кругозора.
Предположим нужно брать строки из списка urls ... список создан, файл со строками указан, установлены галочки брать из файла, сохранять изменения списка в файл ... и в PM созданы 2 переменные - url и label (в первую попадет взятая потоком уникальная строка, во второй метка/идентификатор этой строки, по которуму после выполнения всех действий мы цдалим эту строку из списка)

Код:
lock(SyncObjects.ListSyncer){
    for(int i=0; i<project.Lists["urls"].Count; i++){
        if ( project.Lists["urls"][i].Contains("busy") == false ){ // если никакой другой поток с этой строкой не работает
            project.Variables["url"].Value = project.Lists["urls"][i]; // кладем строку в переменную
            project.Lists["urls"].RemoveAt(i); // удаляем эту строку из списка
            project.Variables["label"].Value = Macros.TextProcessing.RandomText(7,"d",""); // генерим метку/id взятой строки
            project.Lists["urls"].Add(project.Variables["url"].Value+"|busy-"+project.Variables["label"].Value); // возвращаем уже с прибавкой busy-label
            break; // прерываем цикл т.к строку взяли
        }
    }
}
if ( project.Variables["url"].Value == "" ){
    throw new Exception("URLы закончились"); // выход по красной ветке
}
После отработки данного кубика у вас будут заполнены переменные url и label ... или же кубик будет завершен по красному выходу (в случае если свободных строк нет)

Ну и не забывайте после выполнения всех действий удалить из списка urls строку содержащую текст переменной label

UPD: предвижу вопрос - зачем нужна метка/идентификатор строки, почему бы после выпонлнения всех действий просто не удалить по взятому url ? .... потому что в списке может быть несколько одинаковых строк (ну задачи же разные могут быть) и тогда удаляться все такие строки, а у с уникальной меткой только нужная (та с которой работал этот конкретный поток)
 
Последнее редактирование:

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