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

Mikhail B.

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

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
С таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
C#:
IZennoList accounts = project.Lists["accounts"];
Random rnd = new Random();
string accStr;
string[] data;

if(accounts.Count == 0)
{
throw new Exception();
}

lock(SyncObjects.ListSyncer)
{
System.Threading.Thread.Sleep(175);
int index = rnd.Next(0, accounts.Count);
accStr = project.Variables["accStr"].Value = accounts[index];
data = accStr.Split('|');
accounts.RemoveAt(index);
System.Threading.Thread.Sleep(175);
}
Список, естественно, привязан к файлу. Возможно, проблема именно из-за IZennoList.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
вроде норм
С таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
C#:
IZennoList accounts = project.Lists["accounts"];
Random rnd = new Random();
string accStr;
string[] data;

if(accounts.Count == 0)
{
throw new Exception();
}

lock(SyncObjects.ListSyncer)
{
System.Threading.Thread.Sleep(175);
int index = rnd.Next(0, accounts.Count);
accStr = project.Variables["accStr"].Value = accounts[index];
data = accStr.Split('|');
accounts.RemoveAt(index);
System.Threading.Thread.Sleep(175);
}
Список, естественно, привязан к файлу. Возможно, проблема именно из-за IZennoList.
Ну кроме проверки на 0 строк за пределами лока вроде косяков нет. Хз, что бочит у тебя. Глобальный изолированный тест пробовал проводить?
 

Mikhail B.

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

doc

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

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
С таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
C#:
IZennoList accounts = project.Lists["accounts"];
Random rnd = new Random();
string accStr;
string[] data;

if(accounts.Count == 0)
{
throw new Exception();
}

lock(SyncObjects.ListSyncer)
{
System.Threading.Thread.Sleep(175);
int index = rnd.Next(0, accounts.Count);
accStr = project.Variables["accStr"].Value = accounts[index];
data = accStr.Split('|');
accounts.RemoveAt(index);
System.Threading.Thread.Sleep(175);
}
Список, естественно, привязан к файлу. Возможно, проблема именно из-за IZennoList.
запускаем твой код в 100 потоков. все потоки пролетят до лока показав что в списке например 50 строк, после по очереди у тебя отработает каждый поток норм пока в списке находятся строки, но потоки в ожидании, они уже проверку на пустоту списка прошли, и остальные 50 потоков просто с пустым списком будет работать, и паузы в локе не спасут, до лока потоки залетят быстрее чем первый выйдет
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Ну кроме проверки на 0 строк за пределами лока вроде косяков нет.
В данном случае, меня эта проверка устраивает вне лока, она формальна, там всегда несколько тысяч строк не в работе.
Глобальный изолированный тест пробовал проводить?
Не понимаю о чём речь. Как это сделать?
запускаем твой код в 100 потоков. все потоки пролетят до лока показав что в списке например 50 строк, после по очереди у тебя отработает каждый поток норм пока в списке находятся строки, но потоки в ожидании, они уже проверку на пустоту списка прошли, и остальные 50 потоков просто с пустым списком будет работать, и паузы в локе не спасут, до лока потоки залетят быстрее чем первый выйдет
Не, Я понимаю эту логику, но, в данном случае, такой ситуации не возникнет, выше написал. Строк несколько тысяч, потоков менее 100.
Пустота списка выбросит исключение, это другой момент.
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
Не понимаю о чём речь. Как это сделать?
Сделай отдельный шаблон с подобным кодом. Безбраузерный для максимальной скорости. Там внутри пусть будет два списка. Скажем input и output. Первый заполненный, скажем, на 1кк уникальных строк, второй пустой. Оба привязаны к файлам, важно, чтобы больше нигде эти файлы не фигурировали. В самом шаблоне код, подобный твоему. В локе сгенерировали рандомный индекс, строку с ним взяли, строку с ним удалил. Эту строку положили во второй список. И запустить шаб в 1000 потоков на миллион выполнений. Когда шаб отработает и пройдёт достаточно времени для синхронизации - почистить дубли во втором списке. Если после чистки будет меньше 1кк записей - да, где-то есть бок на уровне зеннопостера. И такой шаб я бы исследовал и тоже постестил.

Но я склонен полагать, что бок на твоей стороне. В 99.9% случаев именно мы, пользователи, косячим где-то, при этом твёрдо уверены, что это какой-то баг. Такое было с каждым из нас
 
  • Спасибо
Реакции: Metrix

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Вот мы сделали чтение
Код:
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("");

А запись у меня такая, и что интересно привязка к листу другая совсем. Это может быть проблемой? Какие ошибки в коде есть?
C#:
var List1 = project.Lists["GENERAL-LIST"];
var url2 = project.Variables["ID"].Value;
lock(SyncObjects.ListSyncer)
{
    if (url2 != "")
    {
    List1.Add(url2);
        return "Ok";
    }
}
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Вот мы сделали чтение
Код:
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("");

А запись у меня такая, и что интересно привязка к листу другая совсем. Это может быть проблемой? Какие ошибки в коде есть?
C#:
var List1 = project.Lists["GENERAL-LIST"];
var url2 = project.Variables["ID"].Value;
lock(SyncObjects.ListSyncer)
{
    if (url2 != "")
    {
    List1.Add(url2);
        return "Ok";
    }
}
это как ?
GENERAL-LIST под одним именем 2 списка привязаны к разным к файлам, или перепривязку делаешь ?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 640
Баллы
113
и что интересно привязка к листу другая совсем
такая же. Просто в первом случае ты явно указал тип, во втором не указывал, но он подхватится сам из присваиваемого значения
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
это как ?
GENERAL-LIST под одним именем 2 списка привязаны к разным к файлам, или перепривязку делаешь ?
Так у меня 2 шаблона. Один пишет, другой читает. Но файл один.
Список вот таким образом привязан.

2019-07-25_141853.jpg
 

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
Сделал шаблончик для глобального теста, миллион строк не прогнал, что-то боюсь за свой hdd, 50к строк выполнил в 1000 потоков, дублей не обнаружено в конечном списке, общее кол-во строк в обоих списках так и осталось 1кк.
Следовательно, паузы не актуальны при локе списков.
Посмотрел тот проект, в котором наблюдал сбои при работе со списками, там запись в список с помощью экшенов, может быть проблема в них, это надо тоже протестить.
Есть ещё одна теория, связанная с тем, что файлы находились на Рам-диске, её тоже надо будет проверить как время будет, понятно, что списки в памяти, но файлы тоже в памяти ).
Проект приложил, кому будет интересно протестировать. Сниппет создания списка с 1кк строк внутри.
 

Вложения

  • 16,4 КБ Просмотры: 8
  • Спасибо
Реакции: doc

Mikhail B.

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

Metrix

Client
Регистрация
03.01.2014
Сообщения
343
Благодарностей
272
Баллы
63
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

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

sydoow

Client
Регистрация
22.06.2011
Сообщения
287
Благодарностей
148
Баллы
43
Ну что, решили как бороться с этим?

У меня 2 разных шаба работают с одним файлом через список одновременно.
Оба шаблону берут строки и записывают их обратно.
Идёт утечка акков и записывание дублей.

Как такое починить?

В обоих шаблонах есть такие кубы
Куб 1:
IZennoList list1 = project.Lists["temp"];
list1.Bind(project.Path+"accs.txt");
lock(SyncObjects.ListSyncer){
    project.Variables["acc"].Value = list1.GetItem("random",true);
}
Куб 2:
IZennoList list1 = project.Lists["temp"];
list1.Bind(project.Path+"accs.txt");
lock(SyncObjects.ListSyncer){
    list1.Add(project.Variables["acc"].Value);
}
 
  • Спасибо
Реакции: Mikhail B.

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Ну что, решили как бороться с этим?

У меня 2 разных шаба работают с одним файлом через список одновременно.
Оба шаблону берут строки и записывают их обратно.
Идёт утечка акков и записывание дублей.
Скорость записи чтения какая?
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 387
Благодарностей
5 447
Баллы
113
Ну что, решили как бороться с этим?
Уже выше кидал снипеты, скину еще раз.
Запись
C#:
var List1 = project.Lists["GENERAL-LIST"];
var url2 = project.Variables["ID"].Value;
lock(SyncObjects.ListSyncer)
{
    if (url2 != "")
    {
    List1.Add(url2);
        return "Ok";
    }
}
Чтение
C#:
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("");
 
  • Спасибо
Реакции: sydoow

Mikhail B.

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

Я не уверен на 100% что оно не пропускает дубли и прочее. Если есть у тебя желание, можешь проверить и сообщить результат. Но самое простое решение таких проблем это добавить в лок паузу.
 

WebBot

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

Mikhail B.

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

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 751
Благодарностей
1 385
Баллы
113
Никаких танцев нету. Обычная логика PM на кубах.
Да это понятно. Я просто для своих шаблонов давно отказался от зенно списков и таблиц. Все перевел на MySQL и ни разу об этом не пожалел. Тут хоть 10 шабов могут одновременно писать/читать таблицу и все будет ok, а при зависании постера никакие данные из таблиц не пропадут. Ну и плюсом идет вся мощь языка запросов SQL.
Впрочем, если шаблон делается для дальнейшей продажи, то возможно БД не самый лучший вариант т.к для клиента установка того же OpenServer это доп. гемор
 
  • Спасибо
Реакции: sydoow и Mikhail B.

sydoow

Client
Регистрация
22.06.2011
Сообщения
287
Благодарностей
148
Баллы
43
@sydoow

Я не уверен на 100% что оно не пропускает дубли и прочее. Если есть у тебя желание, можешь проверить и сообщить результат. Но самое простое решение таких проблем это добавить в лок паузу.
Окей

Да это понятно. Я просто для своих шаблонов давно отказался от зенно списков и таблиц. Все перевел на MySQL и ни разу об этом не пожалел. Тут хоть 10 шабов могут одновременно писать/читать таблицу и все будет ok, а при зависании постера никакие данные из таблиц не пропадут. Ну и плюсом идет вся мощь языка запросов SQL.
Впрочем, если шаблон делается для дальнейшей продажи, то возможно БД не самый лучший вариант т.к для клиента установка того же OpenServer это доп. гемор
Да это понятно что БД - это топ варик, но для этого БД нужно немного подучить :-)
 

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 751
Благодарностей
1 385
Баллы
113
Да это понятно что БД - это топ варик, но для этого БД нужно немного подучить :-)
Да, без этого не обойтись. Но, равно или поздно все равно упрешься в слабые места файлов и тут уже будет без вариантов. У меня это случилось когда нужно было работать со списком в десяток миллионов строк ... зенна со стандартным списком умерла не приходя в сознание ;-) А для MySQL это вообще не проблема!
 
  • Спасибо
Реакции: FreddyKrueger и sydoow

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