Один список на два шаблона

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Как правильно использовать такой список, что бы не было багов и каких-то неожиданностей.
Лочить на чтение и на запись достаточно? Или может обращаться к списку не зенновскими методами, а на прямую?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

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

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113

orka13

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Не должно, но будут. У меня 2 шаба работают с одним списком (простенький список прокси на 10...100К строк), прикрепленным к файлу. Пробовал и на C# с локами, и обычными кубиками зенки, но все равно проскакивает глюк:
Один шаб в 1-поток по расписанию добавляем в этот список строки-прокси каждые 2 минуты. Второй шаб постоянно в многоптоке (~70 броаузерных потоков, в общих чертах ~10...100 обращений в минуту) дергает из списка прокси. Если первый шаб попадает на активную фазу работ второго, то судя по его логам он успешно справляется, увеличивая количество строк в списке. Но в реале, и как видно по логам работы второго шаба список нифига не увеличивается и добавленных строк в нем нет. И такое происходит ~ каждый час (то есть в ~3% работы первого шаба).
покажи куски добавления и дергания
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Не должно, но будут. У меня 2 шаба работают с одним списком (простенький список прокси на 10...100К строк), прикрепленным к файлу. Пробовал и на C# с локами, и обычными кубиками зенки, но все равно проскакивает глюк:
Один шаб в 1-поток по расписанию добавляем в этот список строки-прокси каждые 2 минуты. Второй шаб постоянно в многоптоке (~70 броаузерных потоков, в общих чертах ~10...100 обращений в минуту) дергает из списка прокси. Если первый шаб попадает на активную фазу работ второго, то судя по его логам он успешно справляется, увеличивая количество строк в списке. Но в реале, и как видно по логам работы второго шаба список нифига не увеличивается и добавленных строк в нем нет. И такое происходит ~ каждый час (то есть в ~3% работы первого шаба).
Выходит локи, не лочат на 100%. Может тогда лок завернуть в лок? :D
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 370
Баллы
113

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Выходит локи, не лочат на 100%
Да всё лочит нормально, просто имея список в 100к как у orka13 я думаю что у него с лока выходит цикл быстрее чем туда запись сохраняется. и поэтому со временем он не все сохранения видит
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
У меня список 90% времени будет пустым. И изредка туда будет значения записываться. Цель как можно быстрее прочитать (без фанатизма). Проверка будет частая, может раз секунду, может чаще.
Вот думаю как в локе проверять на наличие строки/строк список? Или может просто проверять кубом на наличие, а потом брать строку с удалением уже в локе?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
У меня список 90% времени будет пустым. И изредка туда будет значения записываться. Цель как можно быстрее прочитать (без фанатизма). Проверка будет частая, может раз секунду, может чаще.
Вот думаю как в локе проверять на наличие строки/строк список? Или может просто проверять кубом на наличие, а потом брать строку с удалением уже в локе?
всё зависит от поточности. В одном потоке можно. В 2 и более есть вероятность, что два потока проверят наличие одной и той же строки, но взять её сможет только один
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Вот слепил код для чтения, из кусков другого.
UPD. Подправил код.

Правильно сделал?

C#:
IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями
int count = 20;
for (int i = 0; i < count; i++)
{
  if (GeneralList.Count == 0)
  System.Threading.Thread.Sleep(1 * 500);
  break;
string url = string.Empty;
lock (SyncObjects.ListSyncer)
  { 
  url = GeneralList[0];
  GeneralList.RemoveAt(0);
  return url;
  }
}
UPD. Кароче, он мне ОК возвращает. Не верно видимо назначил url.
 
Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
упс, как то подругому было
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Вот слепил код для чтения, из кусков другого.
UPD. Подправил код.

Правильно сделал?

C#:
IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями
int count = 20;
for (int i = 0; i < count; i++)
{
  if (GeneralList.Count == 0)
  System.Threading.Thread.Sleep(1 * 500);
  break;
string url = string.Empty;
lock (SyncObjects.ListSyncer)
  { 
  url = GeneralList[0];
  GeneralList.RemoveAt(0);
  return url;
  }
}
а что он должен делать?
 

Mikhail B.

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

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
покажи куски добавления и дергания
попробую сделать примерочные шаблоны с нумерованными строками чтобы потом отловить ошибку с гарантией и сделаю отдельный топик\пост с етим глюком в ближайшие дни.
 
  • Спасибо
Реакции: Mikhail B.

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Брать строку в локе. Если нет строки, ждать.


Да я менял ошибки пару раз.
лок лучше расширить на всю итерацию цикла. Паузу вынести за лок. Убрать брейк. Ну и переменную не обязательно объявлять прям заранее

upd.
Ну и равно на больше поменять

попробую сделать примерочные шаблоны с нумерованными строками чтобы потом отловить ошибку с гарантией и сделаю отдельный топик\пост с етим глюком в ближайшие дни.
Вариант хороший, правда трудоёмкий
 
Последнее редактирование:
  • Спасибо
Реакции: Mikhail B.

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Брать строку в локе. Если нет строки, ждать.
так попробуй
Код:
Thread.Sleep(Global.Classes.rnd.Next(10000, 20000));

IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями

int count = 20;
for (int i = 0; i < count; i++)
{
    string url = string.Empty;
  
    if (GeneralList.Count <= 0)
    {
        System.Threading.Thread.Sleep(1 * 500);
        continue;
    }
  
    lock (SyncObjects.ListSyncer)
    {
        url = GeneralList[0];
        GeneralList.RemoveAt(0);
        break;
    }
}
или

C#:
int count = 20;
for (int i = 0; i < count; i++)
{
    string url = string.Empty;
   
    lock (SyncObjects.ListSyncer)
    {
        if (GeneralList.Count > 0)
        {
            url = GeneralList[0];
            GeneralList.RemoveAt(0);
            break;
        }
    }
   
    System.Threading.Thread.Sleep(1 * 500);
}
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

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

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Я тоже сталкивался с проблемой того, что информация в файлах не успевала обновляться при работе со списками (всё, естественно, залочено), и случались сбои.
Решается установкой пауз внутри лока перед и до манипуляцией со списком.
 

Mikhail B.

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

doc

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

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

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
На сколько больших пауз? 200 мс хватит?
ну у меня примерно такие сейчас стоят, хватает.
информация в файлах и не должна успевать обновляться. Главное, что она в памяти обновляется, в с памяти же идёт с ней работа
Реальные сбои подобного рода могут быть, если пытаться усидеть на двух стульях - работать с файлом и как со списком, и как с файлом
Работа только как со списком.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
информация в файлах и не должна успевать обновляться. Главное, что она в памяти обновляется, в с памяти же идёт с ней работа

Реальные сбои подобного рода могут быть, если пытаться усидеть на двух стульях - работать с файлом и как со списком, и как с файлом
Значит паузы ставить перед и после чтения смысла нет, или может все же поставить 200 мс, для спокойствия :D
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Значит паузы ставить перед и после чтения смысла нет, или может все же поставить 200 мс, для спокойствия :D
Ожидание - реальность, проверь, потом расскажешь как без пауз )
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
у меня есть таблица без лока и лист с локом, с листа берёт с удалением, в таблице работает по нахождению, если я в работе открою таблицу ей кирдык, запись если неуспела записаться то это мой был косяк что я таблицу открыл, поэтому никогда не открывайте списки и таблицы с которыми работаешь, делаешь просто копию и открываешь, и всё вуаля
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 415
Благодарностей
5 454
Баллы
113
Форум отказывается код хавать)) Блочит)
Скрин кину.
2019-07-25_125131.jpg

UPD.
В общем вот, финальный код получился такой)

UPD2. Обновил.

Код:
Thread.Sleep(Global.Classes.rnd.Next(100, 200));
IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями

int count = 2;
for (int i = 0; i < count; i++)
{
  string url = string.Empty;
  
  lock (SyncObjects.ListSyncer)
  {
  if (GeneralList.Count > 0)
  {
  url = GeneralList[0];
  GeneralList.RemoveAt(0);
  return url;
  }
  }
  System.Threading.Thread.Sleep(1 * 500);
}
throw new Exception("");
 
Последнее редактирование:
  • Спасибо
Реакции: doc

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
  • Спасибо
Реакции: Mikhail B.

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
у меня есть таблица без лока и лист с локом, с листа берёт с удалением, в таблице работает по нахождению, если я в работе открою таблицу ей кирдык, запись если неуспела записаться то это мой был косяк что я таблицу открыл, поэтому никогда не открывайте списки и таблицы с которыми работаешь, делаешь просто копию и открываешь, и всё вуаля
Это относится к продуктам линейки "Microsoft Office Excel" и им подобным, которые лочат файл для других процессов на все время работы с ним, даже если это просто просмотр без редактирования. EmEditor (идеален для работы с CSV \ TSV таблицами) и Notepad++ такого не делают и не вредят зенке.
 
  • Спасибо
Реакции: Metrix и doc

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Форум отказывается код хавать)) Блочит)
Скрин кину.

UPD.
В общем вот, финальный код получился такой)

Код:
Thread.Sleep(Global.Classes.rnd.Next(100, 200));

IZennoList GeneralList = project.Lists["GENERAL-LIST"]; //Получаем указатель на лист с проксями

int count = 2;
for (int i = 0; i < count; i++)
{
    string url = string.Empty;
 
    lock (SyncObjects.ListSyncer)
    {
        if (GeneralList.Count > 0)
        {
            System.Threading.Thread.Sleep(1 * 200);
            url = GeneralList[0];
            GeneralList.RemoveAt(0);
            System.Threading.Thread.Sleep(1 * 200);
            return url;
            break;
        }
    }
    System.Threading.Thread.Sleep(1 * 500);
}
throw new Exception("");
брейк и паузы внутри лока убери. Это общий лок для всех операций со списками в зенке. Ты создаёшь очередь для всех операций со списками в программе в 0.4 секунды на пустом месте
 
  • Спасибо
Реакции: Mikhail B.

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