Многопоток

Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
Всем привет. Нужна помощь.
Есть шаблон в котором из списка берется случайная ссылка с удалением. При включении шаблона в 2ва потока или более.. 1на и таже ссылка отрабатывает паралельно в разных потогках. Что изменить или добавить в шаб чтоб было все красиво?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Взять первую строчку с файла с удалением (многопоток):
string line = string.Empty; // Строка которую взяли с удалением
string path = string.Empty; // Путь к файлу
    List<string> list = new List<string>();
    lock(CommonCode.SyncObject) {
        try {
            list = File.ReadAllLines(path).Where(x => !string.IsNullOrEmpty(x)).OrderBy(x=>Guid.NewGuid()).ToList();
                    // Взяли все строчки, случайным образом перемешали
                    if(list.Count > 0) {
                        line = list[0]; // взяли оттуда первую строчку
                        list.RemoveAt(0); // удалили её
                        File.WriteAllLines(path, list); // перезаписали файл
                    }
                }
                catch {
                    project.SendWarningToLog(string.Format(@"Ошибка доступа к файлу: {0}", path),true);
                }
            }
            return line;
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
C#:
lock(CommonCode.SyncObject){
var list = project.Lists["Ваш список"];
    if(list.Count>0){   
        Random rand = new Random((int)DateTime.Now.Ticks);
        int str = rand.Next(0,list.Count);
        string url = list[str].Trim();
        list.RemoveAt(str);
        return url;
    }
    else throw new Exception("список ссылок пуст");
}
 
  • Спасибо
Реакции: brun0 и one
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
Спасибо. В 1м коде не понял куда прописать сам список а куда прописать название переменной куда положится ссылка.
А в 2м коде список прописал, но тоже имя переменной не пойму куда вставить
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
В настройках кубика "положить результат в переменную". Снять галку с "Не возвращать значение"
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
Спасибо. В 1м коде не понял куда прописать сам список а куда прописать название переменной куда положится ссылка.
А в 2м коде список прописал, но тоже имя переменной не пойму куда вставить
В моем коде не нужен список - просто подаете путь к файлу.
Данные возвращаются в переменную, которую Вы укажете в кубике Свой C# код.

Для работы со списком код Alexmd будет более корректным.
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
test1.png
 
Последнее редактирование модератором:

Phoenix78

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

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 022
Благодарностей
1 424
Баллы
113
а я вообще кубиком забираю первую строку из списка.... не я конечно скопировал оба примера выше приведенные, но осадок остался. кубиком разве нельзя в многопотоке обрабатывать список ? или я чего не знаю ?
Кто-то из админов, по-моему, говорил, что в кубик вшит лок, но практика показывает, что, если он там и есть, то работает он не так, как нужно.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
а я вообще кубиком забираю первую строку из списка.... не я конечно скопировал оба примера выше приведенные, но осадок остался. кубиком разве нельзя в многопотоке обрабатывать список ? или я чего не знаю ?
Ну например так можно:
66468
 
Последнее редактирование:

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Кто-то из админов, по-моему, говорил, что в кубик вшит лок, но практика показывает, что, если он там и есть, то работает он не так, как нужно.
Не знаю какая у вас там практика, но за год работ со списками, ни единой проблемы в многопотоке не было.
 
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
а я вообще кубиком забираю первую строку из списка.... не я конечно скопировал оба примера выше приведенные, но осадок остался. кубиком разве нельзя в многопотоке обрабатывать список ? или я чего не знаю ?
я тоже кубиком обычно "операции над списком" "получить строку" но стоило запустить в много-потоке, почему-то пересекаются одинаковые ссылки. хотя предварительно были удалены дубли.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
я тоже кубиком обычно "операции над списком" "получить строку" но стоило запустить в много-потоке, почему-то пересекаются одинаковые ссылки. хотя предварительно были удалены дубли.
сколько потоков запущено ? неужели даже на 2-х потоках пересекаются. что то там про рандом было ? а если забирать не рандомно, а только первую с удалением, тоже пересекаются ?
 
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
сколько потоков запущено ? неужели даже на 2-х потоках пересекаются. что то там про рандом было ? а если забирать не рандомно, а только первую с удалением, тоже пересекаются ?
Да пересекаются даже при 2х и рандомно взять/удалить и 1ю тоже. хз почему, вчера норм было, сегодня правил шаб, вот так стало.
 
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
не пересекаются, только что проверил. Это логическая ошибка. Если ты берешь рандомную строку и ложишь в конец, естественно, в следующий раз она опять может взяться. Тебе надо брать первую, её удалять и ложить в конец
 

Вложения

  • 13 КБ Просмотры: 72

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
5.47.0.0 версия. у ссылку я использую только 1н раз без перезаписи.

66470
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
5.47.0.0 версия. у ссылку я использую только 1н раз без перезаписи.

Посмотреть вложение 66470
А почему вы не берете например первую строку, а перед этим, например, этим же кубиком 1раз перемешать список, если уже реально стала проблема в рандоме?
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Видишь, ты берешь случайную строку. Случайность может быть и такой - строка 1, след-й поток строка 1 и т.д. Десять подряд раз взять первую строку - тоже случайность. Ошибка в логике
 
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
жесть. а вот эти 2 примера что выше приводили, помогают ?
по ним ошибка выходит по этим примерам. при прописи эих кодов в C шаб вообще не 1н экшин не работает. я в С не селен вообще, только если на форуме найду, вставляю. работает.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
по ним ошибка выходит по этим примерам. при прописи эих кодов в C шаб вообще не 1н экшин не работает. я в С не селен вообще, только если на форуме найду, вставляю. работает.
На данный момент вопрос решен? Или вам помочь по удаленке показать как кубиком или c# вставить?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
ну даже если 10 потоков рандомно получат 1-й строку, то лок в кубиках, якобы там присутсвующий не должен давать им этого сделать....
 
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
С
А почему вы не берете например первую строку, а перед этим, например, этим же кубиком 1раз перемешать список, если уже реально стала проблема в рандоме?
Попробую так тоже конечно. просто вроде как экшин должен удалять взятую строку, и он какбы удаляет, но вот почемуто пересекаются в итоге...
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
ну даже если 10 потоков рандомно получат 1-й строку, то лок в кубиках, якобы там присутсвующий не должен давать им этого сделать....
А вы работаете с 5той версией? Так как на 7мой точно такого не наблюдалось, поэтому по ней могу сказать что там нету данной проблемы, по крайней мере клиенты не жаловались, а вот 5тая, не уверен.
 
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
На данный момент вопрос решен? Или вам помочь по удаленке показать как кубиком или c# вставить?
Пока-что я сделал так, создал несколько копий шаблона (у каждой копии свой уникальный список) пока работает, но тут уже стало интересно почему пересекаются ссылки в разных потоках.
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
ну даже если 10 потоков рандомно получат 1-й строку, то лок в кубиках, якобы там присутсвующий не должен давать им этого сделать....
Эх, никто меня не слушает. Пойду бухну...

Смотри, получить рандомную строку. Это значит, от начала и списка и до конца. У нас есть список:
1
2
3

1-й поток получает рандомно 1. 2-й поток тоже получает рандомно 1. 3-й поток получает рандомно 3. Лок тут вообще не при чем. Как и удаление в данном случае ни на что не влияет, потому что в конечном счете строка возвращается в список. Пересечение происходит потому что получается случайная строка, а не потому что лок не работает
 

Phoenix78

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

C#:
lock(CommonCode.SyncObject){
var list = project.Lists["Входные Email"];
    if(list.Count>0){   
        Random rand = new Random((int)DateTime.Now.Ticks);
        int str = rand.Next(0,list.Count);
        string url = list[str].Trim();
        list.RemoveAt(str);
        return url;
    }
    else throw new Exception("список ссылок пуст");
}
по ним ошибка выходит по этим примерам. при прописи эих кодов в C шаб вообще не 1н экшин не работает. я в С не селен вообще, только если на форуме найду, вставляю. работает.
 
Регистрация
28.06.2016
Сообщения
308
Благодарностей
17
Баллы
18
Не
А вы работаете с 5той версией? Так как на 7мой точно такого не наблюдалось, поэтому по ней могу сказать что там нету данной проблемы, по крайней мере клиенты не жаловались, а вот 5тая, не уверен.
могу к 7мерке привыкнуть просто. 5я более привычный интерфейс чтоли.
 

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