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

  • Автор темы Автор темы Mikhail B.
  • Дата начала Дата начала
С таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
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.
 
вроде норм
С таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
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 строк за пределами лока вроде косяков нет. Хз, что бочит у тебя. Глобальный изолированный тест пробовал проводить?
 
С таким кодом без пауз у меня потоки хватали одинаковые строки. Так что, смотри сам.
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 потоков просто с пустым списком будет работать, и паузы в локе не спасут, до лока потоки залетят быстрее чем первый выйдет
 
Ну кроме проверки на 0 строк за пределами лока вроде косяков нет.
В данном случае, меня эта проверка устраивает вне лока, она формальна, там всегда несколько тысяч строк не в работе.
Глобальный изолированный тест пробовал проводить?
Не понимаю о чём речь. Как это сделать?
запускаем твой код в 100 потоков. все потоки пролетят до лока показав что в списке например 50 строк, после по очереди у тебя отработает каждый поток норм пока в списке находятся строки, но потоки в ожидании, они уже проверку на пустоту списка прошли, и остальные 50 потоков просто с пустым списком будет работать, и паузы в локе не спасут, до лока потоки залетят быстрее чем первый выйдет
Не, Я понимаю эту логику, но, в данном случае, такой ситуации не возникнет, выше написал. Строк несколько тысяч, потоков менее 100.
Пустота списка выбросит исключение, это другой момент.
 
Последнее редактирование:
Не понимаю о чём речь. Как это сделать?
Сделай отдельный шаблон с подобным кодом. Безбраузерный для максимальной скорости. Там внутри пусть будет два списка. Скажем input и output. Первый заполненный, скажем, на 1кк уникальных строк, второй пустой. Оба привязаны к файлам, важно, чтобы больше нигде эти файлы не фигурировали. В самом шаблоне код, подобный твоему. В локе сгенерировали рандомный индекс, строку с ним взяли, строку с ним удалил. Эту строку положили во второй список. И запустить шаб в 1000 потоков на миллион выполнений. Когда шаб отработает и пройдёт достаточно времени для синхронизации - почистить дубли во втором списке. Если после чистки будет меньше 1кк записей - да, где-то есть бок на уровне зеннопостера. И такой шаб я бы исследовал и тоже постестил.

Но я склонен полагать, что бок на твоей стороне. В 99.9% случаев именно мы, пользователи, косячим где-то, при этом твёрдо уверены, что это какой-то баг. Такое было с каждым из нас
 
  • Спасибо
Реакции: Metrix
Вот мы сделали чтение
Код:
Развернуть Свернуть Копировать
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";
    }
}
 
Вот мы сделали чтение
Код:
Развернуть Свернуть Копировать
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 списка привязаны к разным к файлам, или перепривязку делаешь ?
 
и что интересно привязка к листу другая совсем
такая же. Просто в первом случае ты явно указал тип, во втором не указывал, но он подхватится сам из присваиваемого значения
 
  • Спасибо
Реакции: Mikhail B.
это как ?
GENERAL-LIST под одним именем 2 списка привязаны к разным к файлам, или перепривязку делаешь ?
Так у меня 2 шаблона. Один пишет, другой читает. Но файл один.
Список вот таким образом привязан.

2019-07-25_141853.jpg
 
Сделал шаблончик для глобального теста, миллион строк не прогнал, что-то боюсь за свой hdd, 50к строк выполнил в 1000 потоков, дублей не обнаружено в конечном списке, общее кол-во строк в обоих списках так и осталось 1кк.
Следовательно, паузы не актуальны при локе списков.
Посмотрел тот проект, в котором наблюдал сбои при работе со списками, там запись в список с помощью экшенов, может быть проблема в них, это надо тоже протестить.
Есть ещё одна теория, связанная с тем, что файлы находились на Рам-диске, её тоже надо будет проверить как время будет, понятно, что списки в памяти, но файлы тоже в памяти ).
Проект приложил, кому будет интересно протестировать. Сниппет создания списка с 1кк строк внутри.
 

Вложения

  • 1.xmlz
    1.xmlz
    16,4 KB · Просмотры: 8
  • Спасибо
Реакции: doc
Ну что, решили как бороться с этим?

У меня 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.
Ну что, решили как бороться с этим?

У меня 2 разных шаба работают с одним файлом через список одновременно.
Оба шаблону берут строки и записывают их обратно.
Идёт утечка акков и записывание дублей.
Скорость записи чтения какая?
 
Ну что, решили как бороться с этим?
Уже выше кидал снипеты, скину еще раз.
Запись
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
@sydoow

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

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

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

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