Как избавится от дублей при работе со списком.

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Посоветуйте что сделать что бы не было дублей в файле тхт.
Работаю со списками, беру первую строку с удалением и записываю в конец.
Но при многопотоке (80 потоков) Получаются дубли постоянно, и даже вижу что работа идет в том же самом аке. Ну и соответсвенно в тхт списках тоже дубли.
Посоветуйте что делать, работат с БД не вариант.Нужно толко списки.
 

Phoenix78

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

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Можно подробнее, я c# не знаком.

Что такое лок?
 
  • Спасибо
Реакции: AndreyAAA

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
Можно попробовать, привязка к файлу, потом берет строку и в конец+пауза в конце и все это в локе
C#:
lock(Locker.Домены)
{
// Привязать список к файлу

IZennoList list = project.Lists["Список"];
list.Bind(@project.Variables["domen"].Value);
//Данный код берет прокси из списка proxyes.txt с ротацией. (берет первую строку и возвращает в конец)

string proxy_full = String.Empty;


    proxy_full = project.Lists["Список"].GetItem("0", true);
  project.Lists["Список"].Add(proxy_full);
}

project.Variables["dom"].Value = proxy_full;
// Установленная пауза
System.Threading.Thread.Sleep(10 * 1000);
}
 
  • Спасибо
Реакции: AndreyAAA

White trash

Client
Регистрация
09.06.2014
Сообщения
829
Благодарностей
362
Баллы
63
или просто убирать дубли встроенной функцией для работы со списками.
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
745
Баллы
113
или просто убирать дубли встроенной функцией для работы со списками.
Не получиться, скорее всего их там и так нет, при старте, а в процессе работы, они там появляются, а если ставить через каждый кубик удалить дубли, возможно будет ошибка, коллекция была изменена, перечисление и т.д
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
или просто убирать дубли встроенной функцией для работы со списками.
Да я так тоже думал, но была проблемма, так как строки разные получались, менялись, и пришлось удалять дубли по первому значению(логин) и при том только через таблицу.
В итоге может быть и сработало, но в именно в зенке не хера не удалят дубли, а в ПМ да.
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Почитал про ЛОК, ну по сути же если сделать лок там где берет строку и добавляет в конец то не должны быть дубли?
Или этого не достаточно будет разве?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Посоветуйте что сделать что бы не было дублей в файле тхт.
Работаю со списками, беру первую строку с удалением и записываю в конец.
Но при многопотоке (80 потоков) Получаются дубли постоянно, и даже вижу что работа идет в том же самом аке. Ну и соответсвенно в тхт списках тоже дубли.
Посоветуйте что делать, работат с БД не вариант.Нужно толко списки.
если работаешь экшенами и появляются дубли - значит где-то логика неправильная. Где-то ты дополнительно делаешь запись
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Последнее время зенка в подобной схеме обычным кубиком не должна делать подобных глюков с дублями даже на многопотоке большом. Она тогда просто медленнее файл будет обрабатывать, но дублей не наделает, там же тоже есть свой внутренний лок на обычных кубиках. Но он срабатывает ТОЛЬКО в пределах одного шаблона одного зенопстера. То есть если в схеме ТС:
1) доступ к списку имеют 2 разных шаблона
2) или тот же шаблон но из зенопстера и из проджектмейера
3) или тот же шаблон но добавлен в зенопостер 2 раза (в последнем варианте я не уверен на 100%, на практике не проверял)
- тогда да, могут быть дубли. Выход возможно в C# нестандартных локах с топика что выше предлагали. Вопрос к ТС: в схеме есть что-то из тех трех вариантов?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
1) доступ к списку имеют 2 разных шаблона
2) или тот же шаблон но из зенопстера и из проджектмейера
3) или тот же шаблон но добавлен в зенопостер 2 раза (в последнем варианте я не уверен на 100%, на практике не проверял)
2й вариант мб, а 1й и 3й не должны косячить
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
2й вариант мб, а 1й и 3й не должны косячить
1й косячит, проверено и на обычных списках кубиками, и C# с локом обычным, без разницы:
косячит каждый день в связке: 1 шаблон браузерный в 70 потоков делает манипуляции и непрерывно в среднем 1 строку в секунду берт прокси из списка на 30К с удалением. Второй безбраузерный каждый час берет свежие актуальные прокси с панели провайдера, очищает список и добавляет новые. В итоге несколько раз в сутки второй шаб не делает ничего из списком так как первый с ними "не делится". Если же первый шаб работает не в 70 потоков а в 10 (то есть реже обращается к списку), то проблемы не наблюдаю.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
держи готовый варик, 100% работает, использую под прокси, но можно под что угодно

C#:
//берем из списка прокси с удалением и записываем ее в конец списка
var ProxyList = project.Lists["proxy"];
lock(SyncObjects.ListSyncer)
{
var proxy = ProxyList[0];
ProxyList.RemoveAt(0);
ProxyList.Add(proxy);
project.Variables["proxy"].Value = proxy.ToString();
}
можно поменять название списка - project.Lists["proxy"];
то что берется из списка proxy ( регистр важен )
и кладет взятую строчку в переменную - project.Variables["proxy"].Value

на здоровье :-)

ps \ список привязываем к txt файлу, конечно же
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113
не использовать списки зенки, именно их привязку к файлу
Проблема не в списках, а скорее в отсутствии возможности lock'а группы экшенов.
Необходимо смотреть, что конкретно у ТС.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Проблема не в списках, а скорее в отсутствии возможности lock'а группы экшенов.
Необходимо смотреть, что конкретно у ТС.
не уверен.... у меня вот вчера у клиента был случай, 1 шаблон в многопотоке 150 потоков. в нем есть только один список привязанный к файлу. это лог. для отладки оставил. то есть 150 потоков 1-го шаблон пишут в один файл. просто лог.
ну клиент пишет, не работает шаблон, не запускается. смотрю в логе ошибка доступа к этому файлу. захожу в папку , а там рядом с этим файлом такой же только .tmp . удалил оба файла и все заработало.
Поэтому в механизме работы со списками есть проблемы, и дубли создаются, и строки теряются и выгребается список в ноль хотя запись в список стоит прям рядом с удалением строки. Все это уже было озвучено не раз на форуме.
В ответ всегда одно и тоже "Проблема не в списках".... ну вот мне как то пофиг на эти проблемы, так как проще отказаться от багованного функционала. Хорошо хоть в зенке c# нормально работает, можно замену придумать.
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
...ну клиент пишет, не работает шаблон, не запускается. смотрю в логе ошибка доступа к этому файлу. захожу в папку , а там рядом с этим файлом такой же только .tmp . удалил оба файла и все заработало....
Это вроде как из-за "Настройки - выполнение - Безопасно сохранять файлы", но эту опцию обычно все отключают.
 

Phoenix78

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

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

не, я не то что говорю что они не работают... списки работают, но для простых проектов. в сложных проектах чот как то больше проблем от них чем пользы. :bk:
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
и насколько я имел опыт работы, эта галочка опять же не понятно на что влияет, и какой эффект дает.
эта галочка при обновлении файла сначала создаёт временный файл как буфер, а потом редактирует основной. В теории это должно позволить не словить файл полный null при критическом сбое программы или компьютера или отключении питания и т.д.
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
Это вроде как из-за "Настройки - выполнение - Безопасно сохранять файлы", но эту опцию обычно все отключают.
Вот мне тоже посоветовали эту опцию поставить, сделал, но хз пока.
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
держи готовый варик, 100% работает, использую под прокси, но можно под что угодно

C#:
//берем из списка прокси с удалением и записываем ее в конец списка
var ProxyList = project.Lists["proxy"];
lock(SyncObjects.ListSyncer)
{
var proxy = ProxyList[0];
ProxyList.RemoveAt(0);
ProxyList.Add(proxy);
project.Variables["proxy"].Value = proxy.ToString();
}
можно поменять название списка - project.Lists["proxy"];
то что берется из списка proxy ( регистр важен )
и кладет взятую строчку в переменную - project.Variables["proxy"].Value

на здоровье :-)

ps \ список привязываем к txt файлу, конечно же
У меня тут встречный вопрос появился, по поводу прокси правда).
Решил использовать моб прокси со сменой ip по урлу.
Теоритечески хотелось бы работать с 10 прокси в 10 потоков. Ну на практике это не реально ни как, так как шаблон может работать долго, а может быстро закончить и т.д. Т.е. если брать по очереди то будут повторятся 100 % прокси в потоках. Есть ли возможность как то реализовать это в зенке? Что бы без повторений при многопотоке.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
Есть ли возможность как то реализовать это в зенке? Что бы без повторений при многопотоке
да, очень просто, каждой прокси надо присвоить статус, например

socks5://blablabla_proxy:status

где status будет work и free например, когда прокси берешь, перезаписываешь ее со статусом work, когда поток закончен перезаписываешь со статусом free
ну и проверяешь статус все время, шаб берет проксю, смотрит что статус == work, значит прокся занята и берем следующую и тд

изи
 
  • Спасибо
Реакции: AndreyAAA

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
У меня тут встречный вопрос появился, по поводу прокси правда).
Решил использовать моб прокси со сменой ip по урлу.
Теоритечески хотелось бы работать с 10 прокси в 10 потоков. Ну на практике это не реально ни как, так как шаблон может работать долго, а может быстро закончить и т.д. Т.е. если брать по очереди то будут повторятся 100 % прокси в потоках. Есть ли возможность как то реализовать это в зенке? Что бы без повторений при многопотоке.
ну так возвращай прокси в список только при завершении работы потока
 
  • Спасибо
Реакции: AndreyAAA

Phoenix78

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

только надо не забывать пополнять файл с проксями, когда они от туда все пропадут :ca::ca::ca:
 

AndreyAAA

Client
Регистрация
07.05.2016
Сообщения
1 250
Благодарностей
78
Баллы
48
НУ в обоих случаях нужно делать BAD END как я понимаю, не всегда шаб без ошибок работает, и еще, тогда прерывать нельзя процесс никогда.
Спасибо, принцип понятен.Я думал может глобалные переменые какие то или еще че то есть в зенке, чего я не знаю)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

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