Не сохраняет текст в список

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
22 288
Благодарностей
9 900
Баллы
113
  • Спасибо
Реакции: ferr9918 и djaga

ferr9918

Client
Регистрация
20.01.2014
Сообщения
201
Благодарностей
97
Баллы
28
Да это все проверил изначально. Проблема имеет место быть когда работают два шаблона с одним файлом. Один шаблон записывает данные в файл по средством добавления строки в список, а второй шаблон берет строку с удалением с этого файла. И не важно одновременно запущены эти два шаблона или по очереди при любом исходе баг выходит через некоторое время. Через некоторое время видим такую картину - файл имеет нулевой размер (так как второй шаблон все выгреб с него), а при добавлении строк первым шаблоном мы видим типа в нем уже N количество строк добавлено хотя файл имеет нулевой размер и при его открытии он естественно пустой.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 789
Благодарностей
5 735
Баллы
113
Да это все проверил изначально. Проблема имеет место быть когда работают два шаблона с одним файлом. Один шаблон записывает данные в файл по средством добавления строки в список, а второй шаблон берет строку с удалением с этого файла. И не важно одновременно запущены эти два шаблона или по очереди при любом исходе баг выходит через некоторое время. Через некоторое время видим такую картину - файл имеет нулевой размер (так как второй шаблон все выгреб с него), а при добавлении строк первым шаблоном мы видим типа в нем уже N количество строк добавлено хотя файл имеет нулевой размер и при его открытии он естественно пустой.
такая же жесть.
Шаблоны в многопотоке работают со списком, через стандартный кубик. в начале шаблон забирает строку с удалением, в конце работы добавляет строку. При увеличении количества потоков, список просто выгребается в ноль и не пополняется.
Данный баг был обойден отказом от стандартных кубиков работы со списками и переходом на C#. очень трудозатратная операция скажу я вам по секрету. Но зато проверено, списки нормально начали работать.

вот такая конструкция была и чем заменена:

68656


если кому нужен код , вот он.
C#:
//---- входные настройки ----
string data = project.Variables["Input_Data_Akk_for_Retvit"].Value;     // данные
var list = project.Lists["Registered_Emails_for_Retvit"];                            // список для операций
var list_2 = project.Lists["Cant_Login_Registered_Emails_IMAP"];                    // список для операций
//---- действие ----
//CommonCode.Add_Data_to_Result(list, data);
lock (CommonCode.ResultDataLocker)
{
    list.Add(data);  // добавляем данные
    // ищем строку с данными и удаляем ее
    for (int i = list_2.Count-1; i >= 0 ; i-- ){
        if (list_2[i] == data) {
            list_2.RemoveAt(i);
        }
    }
    //--   
}
в общем коде надо добавить ResultDataLocker или использовать стандарт SyncObject
68658
 
Регистрация
03.12.2020
Сообщения
154
Благодарностей
109
Баллы
43
такая же жесть.
Шаблоны в многопотоке работают со списком, через стандартный кубик. в начале шаблон забирает строку с удалением, в конце работы добавляет строку. При увеличении количества потоков, список просто выгребается в ноль и не пополняется.
Данный баг был обойден отказом от стандартных кубиков работы со списками и переходом на C#. очень трудозатратная операция скажу я вам по секрету. Но зато проверено, списки нормально начали работать.

вот такая конструкция была и чем заменена:

Посмотреть вложение 68656

если кому нужен код , вот он.
C#:
//---- входные настройки ----
string data = project.Variables["Input_Data_Akk_for_Retvit"].Value;     // данные
var list = project.Lists["Registered_Emails_for_Retvit"];                            // список для операций
var list_2 = project.Lists["Cant_Login_Registered_Emails_IMAP"];                    // список для операций
//---- действие ----
//CommonCode.Add_Data_to_Result(list, data);
lock (CommonCode.ResultDataLocker)
{
    list.Add(data);  // добавляем данные
    // ищем строку с данными и удаляем ее
    for (int i = list_2.Count-1; i >= 0 ; i-- ){
        if (list_2[i] == data) {
            list_2.RemoveAt(i);
        }
    }
    //--  
}
в общем коде надо добавить ResultDataLocker или использовать стандарт SyncObject
Посмотреть вложение 68658
Вчера весь день потратил на то чтобы разобраться с подобной проблемой.
ZennoPoster ведет себя необъяснио. Такое ощущение, что при привязке файла к списку он изолируется от системы. Во всяком случае, шаблон на стандартных экшенах не видит изменений файла, если они производятся третьими программами.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
22 288
Благодарностей
9 900
Баллы
113
Вчера весь день потратил на то чтобы разобраться с подобной проблемой.
ZennoPoster ведет себя необъяснио. Такое ощущение, что при привязке файла к списку он изолируется от системы. Во всяком случае, шаблон на стандартных экшенах не видит изменений файла, если они производятся третьими программами.
"Настройки - Выполнение", здесь ничего не менялось?

79252
 
Регистрация
03.12.2020
Сообщения
154
Благодарностей
109
Баллы
43

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
22 288
Благодарностей
9 900
Баллы
113
Вчера весь день потратил на то чтобы разобраться с подобной проблемой.
ZennoPoster ведет себя необъяснио. Такое ощущение, что при привязке файла к списку он изолируется от системы. Во всяком случае, шаблон на стандартных экшенах не видит изменений файла, если они производятся третьими программами.
Сейчас протестировал в ПМ и ЗП 7.4 поведение при взятии строки спсика при изменении извне (добавление строки вручную в Нотепад++ и сохранение) - все отлично. Попробуйте на простейшем примере шаблона со взятием строки тоже протестировать, а дальше уже будем думать, что произошло и как лечить.
 

zoneofsoft

Client
Регистрация
15.12.2014
Сообщения
93
Благодарностей
20
Баллы
8
Столкнулся с такой же ситуацией.
Есть два файла, в одном лежат данные для обработки, которые берутся построчно с удалением. В другой записывается результат.
В ПМ всё работает как надо. Запускаю в зеннопостере, ничего не работает. То есть данные из файла номер 1 не удаляются и результаты в файл номер 2 не пишутся. При этом сделал специально логирование, и судя по оповещениям каждый новый запуск берёт новую строку, то есть как будто они удаляются из файла.
 

clon4444

Client
Регистрация
27.10.2016
Сообщения
81
Благодарностей
9
Баллы
8
Столкнулся с такой же ситуацией.
Есть два файла, в одном лежат данные для обработки, которые берутся построчно с удалением. В другой записывается результат.
В ПМ всё работает как надо. Запускаю в зеннопостере, ничего не работает. То есть данные из файла номер 1 не удаляются и результаты в файл номер 2 не пишутся. При этом сделал специально логирование, и судя по оповещениям каждый новый запуск берёт новую строку, то есть как будто они удаляются из файла.
попробуй поставить кубик паузы после взятия строки и после записи.
 
  • Спасибо
Реакции: zoneofsoft

Wide

Client
Регистрация
04.02.2013
Сообщения
970
Благодарностей
262
Баллы
63
такая же жесть.
Шаблоны в многопотоке работают со списком, через стандартный кубик. в начале шаблон забирает строку с удалением, в конце работы добавляет строку. При увеличении количества потоков, список просто выгребается в ноль и не пополняется.
Данный баг был обойден отказом от стандартных кубиков работы со списками и переходом на C#. очень трудозатратная операция скажу я вам по секрету. Но зато проверено, списки нормально начали работать.

вот такая конструкция была и чем заменена:

Посмотреть вложение 68656

если кому нужен код , вот он.
C#:
//---- входные настройки ----
string data = project.Variables["Input_Data_Akk_for_Retvit"].Value;     // данные
var list = project.Lists["Registered_Emails_for_Retvit"];                            // список для операций
var list_2 = project.Lists["Cant_Login_Registered_Emails_IMAP"];                    // список для операций
//---- действие ----
//CommonCode.Add_Data_to_Result(list, data);
lock (CommonCode.ResultDataLocker)
{
    list.Add(data);  // добавляем данные
    // ищем строку с данными и удаляем ее
    for (int i = list_2.Count-1; i >= 0 ; i-- ){
        if (list_2[i] == data) {
            list_2.RemoveAt(i);
        }
    }
    //--  
}
в общем коде надо добавить ResultDataLocker или использовать стандарт SyncObject
Посмотреть вложение 68658
Парни, можно для дураков снипет разжевать? У меня трабла со списками уже давно, файлы 100-500 гб и 10 потоков, не объяснить что происходит со списками, то не пишет, то не читает и не удаляет. Попробовал на бд переделать, там тоже свои проблемы. Можно в снипите подсказать как писать, читать и удалять строку? Версия 7.5 и мне кажется ещё долго будет нас преследовать эта проблема.
 

Peplos

Client
Регистрация
31.07.2018
Сообщения
29
Благодарностей
6
Баллы
3
Столкнулся с аналогичной проблемой.

Проблема проявляется в том случае, когда разные шабы работают с одним и тем же файлом через список.

Ожидание: шаблон 1 записывает строку в список, путь к файлу C:\File.txt, шаблон 2 забирает строку из списка ,который ссылается на этот же файл C:\File.txt.

Реальность: рано или поздно шаблон 1 перестает записывать строку в список, шаблону 2 нечего забирать, конвейер ломается.. Если переименовать файл C:\File.txt, например C:\File1.txt, то все заработает, но ненадолго, рано или поздно проблема вернется (скорее рано).

Решение: ни один из вышеперечисленных способов мне не помог, пришлось изобретать велосипед заново. На данный момент проблему решает такой код.

C#:
// Переменные для записи
string temp_email = project.Variables["temp_email"].Value;
string pass = project.Variables["pass"].Value;
string Api_key_cloudflare = project.Variables["Api_key_cloudflare"].Value;
string proxy = project.Variables["proxy"].Value;

string data_to_add = $"{temp_email}:{pass}:{Api_key_cloudflare}:{proxy}";

var list = project.Lists["Результат"];
var list_2 = project.Lists["Результат копия1"];
//записываем в 2 списка - основной и резервный. В переменных ниже - пути к файлам списков
string resultListPath = project.Variables["Result_list"].Value;
string resultList2Path = project.Variables["Result_list2"].Value;

// Функция для записи с проверкой новой строки
Action<string, IZennoList, string> writeToFile = (string path, IZennoList lst, string data) =>
{
    if (!lst.Contains(data))
    {
        lst.Add(data);
     
        if (File.Exists(path) && new FileInfo(path).Length > 0)
        {
            // Проверяем последний символ файла
            byte[] buffer = new byte[1];
            using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                fs.Seek(-1, SeekOrigin.End);
                fs.Read(buffer, 0, 1);
            }
         
            // Если последний символ не \n, добавляем новую строку перед данными
            if (buffer[0] != '\n')
            {
                File.AppendAllText(path, Environment.NewLine + data + Environment.NewLine, Encoding.UTF8);
            }
            else
            {
                File.AppendAllText(path, data + Environment.NewLine, Encoding.UTF8);
            }
        }
        else
        {
            File.AppendAllText(path, data + Environment.NewLine, Encoding.UTF8);
        }
    }
};

lock (SyncObjects.ListSyncer)
{
    writeToFile(resultListPath, list, data_to_add);
}

lock (SyncObjects.ListSyncer)
{
    writeToFile(resultList2Path, list_2, data_to_add);
}
 
Последнее редактирование:

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