Управление шаблоном c#

Konrod_m

Client
Регистрация
18.09.2014
Сообщения
1 649
Благодарностей
913
Баллы
113

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 383
Баллы
113
C#:
ZennoPoster.TasksList.ToList().ForEach(x=>project.Lists["список всех проектов в зенке"].Add(Regex.Match(x,@"(?<=<Name>).*?(?=</Name>)").Value));
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
Друзья подскажите в чем может быть проблема?

Запускаю проект в многопотоке, все норм запускается и проходит 1 цикл, но на втором проходе начинаются проблемы.

Если проект запустить например 5 выполнений в 5 потоков (т.е. 1 выполнение в 5 потоков) то все норм отработает, и если после завершения еще раз так же запустить, то норм отработает.

А вот если поставить например 10/15/100 выполнений и 5 потоков, то первый цикл из 5 потоков пройдет норм, а при повторе начнутся сбои.

Как можно избавиться от такой проблемы или можно как то автоматизировать повторный запуск после завершения выполнения.
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113
У меня шаб сначала работал по кругу, и мне приходилось прерывать шаблон. А теперь сделал, после завершения отрабатывает этот кубик.
C#:
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 5);
А после этого, отрабатывает еще один кубик
C#:
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
 
  • Спасибо
Реакции: Greez и radv

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
У меня шаб сначала работал по кругу, и мне приходилось прерывать шаблон. А теперь сделал, после завершения отрабатывает этот кубик.
C#:
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 5);
А после этого, отрабатывает еще один кубик
C#:
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
Добавить в конец 2 кубика и поставить выполнять 5 раз и 5 потоков?

А если в 1 кубик все добавить?
 

Phoenix78

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

Запускаю проект в многопотоке, все норм запускается и проходит 1 цикл, но на втором проходе начинаются проблемы.

Если проект запустить например 5 выполнений в 5 потоков (т.е. 1 выполнение в 5 потоков) то все норм отработает, и если после завершения еще раз так же запустить, то норм отработает.

А вот если поставить например 10/15/100 выполнений и 5 потоков, то первый цикл из 5 потоков пройдет норм, а при повторе начнутся сбои.

Как можно избавиться от такой проблемы или можно как то автоматизировать повторный запуск после завершения выполнения.
что значит на втором проходе ? шаблон закончил работу, вышел и запускается заного ? или у него внутренний цикл повтора ?
что за сбои ? в чем они выражаются ?
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113
Добавить в конец 2 кубика и поставить выполнять 5 раз и 5 потоков?

А если в 1 кубик все добавить?
Я не пробовал, в один кубик, да и в сишарпе не понимаю.
Первый кубик устанавливает 5 раз выполнения, можно и 2 вместо 5 установить, второй кубик добавляет +1 выполнение.
Шаблон заканчивается, и запускается еще одно выполнение, и так всегда будет
 
  • Спасибо
Реакции: radv

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
что значит на втором проходе ? шаблон закончил работу, вышел и запускается заного ?
Да. когда на второй цикл/проход идет после завершения. Может счетчик потоко неверно обрабатывает у меня, может потоки не завершились до конца и запускаются новые. А сбои думаю как раз из-за счетчика или нового потока идут. т.е. в мой код передает значение глобальной переменной.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
Я не пробовал, в один кубик, да и в сишарпе не понимаю.
Первый кубик устанавливает 5 потоков, можно и 2 вместо 5 установить, второй кубик добавляет +1 выполнение.
Шаблон заканчивается, и запускается еще одно выполнение, и так всегда будет
ну впринципе идея хорошая. может сработать. Попробую. Главное чтобы с нуля пробовал запустить, как при первом запуске.
 

Phoenix78

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

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
неужели без лока ?
локи не помогают. Без них и первый раз многопоток не запустился бы, Просто такое подозрение, что глобальная переменная неверно считает потоки или сбрасывает на ноль их. Уже разные варианты пробовал. Может где то уже затупил.
 

Вложения

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113
Так можно управлять потоками
C#:
lock(SyncObject) {
    if(project.GlobalVariables["Глобал", "z"].Value==null){
        project.GlobalVariables.SetVariable("Глобал", "z", 0);
    }
  if(project.GlobalVariables["Глобал", "z"].Value!=null&&project.GlobalVariables["Глобал", "z"].Value==""){
project.GlobalVariables.SetVariable("Глобал", "z", "Вошли парсить ссылки");
    return "Зашёл 1 поток";
}
    else throw new Exception();

}
На выходе
C#:
lock(SyncObject) {
project.GlobalVariables.SetVariable("Глобал", "z", "");
return "Можно заходить другим";
}
Но сперва переменную надо инициировать, или создать в ручную.






C#:
lock(SyncObject) {
    try {
        var gb_count = project.GlobalVariables["глобал", "shab_name"];
        if(Convert.ToInt32(gb_count.Value) > 5)
        {
            //иди по красной
            throw new Exception();
        }   
          
        return ++gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        project.GlobalVariables.SetVariable("глобал", "shab_name", 1);
        return 1;
    }
}
 
  • Спасибо
Реакции: radv

radv

Client
Регистрация
11.05.2015
Сообщения
3 673
Благодарностей
1 855
Баллы
113
Так можно управлять потоками
Спасибо. Глобальные переменные пробовал. Все равно неверно считает. Буду тестить добавление потоков и выполнений. Должно лучше сработать.
 

myndeswx

Client
Регистрация
15.05.2017
Сообщения
399
Благодарностей
88
Баллы
28
В 7.3.0.0 Добавили возможность получить кол-во активных потоков. Вот код:
C#:
var Id = Guid.Parse(project.TaskId);
int currentTaskThreadsById = ZennoPoster.GetThreadsCount(Id);
return currentTaskThreadsById;
I know this is an old thread, but maybe there is a way to get running thread IDs as well?
Thank you.
 

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 189
Благодарностей
5 830
Баллы
113
Регистрация
23.03.2015
Сообщения
1 113
Благодарностей
649
Баллы
113
Подскажите, а как получить именно заданное максимальное количество потоков, а не текущее активное?
C#:
ZennoPoster.GetThreadsCount(name_project);
Этот метод возвращает количество активных потоков, есть такой же для получения заданного максимального числа потоков?
@Mikhail B.
Есть решение данного вопроса?
 

Mikhail B.

Moderator
Регистрация
23.12.2014
Сообщения
14 303
Благодарностей
5 421
Баллы
113
@Mikhail B.
Есть решение данного вопроса?
Честно сказать я один раз сделал шаблон управлятор и больше его не трогал. По этому не компетентен в данном вопросе. Возможно кто-то из пользователей или администрации ответить сможет. Не исключено, что со времен написания статьи добавили что-то новое.
 
Регистрация
26.05.2020
Сообщения
459
Благодарностей
163
Баллы
43

lbvf65

Client
Регистрация
20.08.2020
Сообщения
438
Благодарностей
113
Баллы
43
Обновлю информацию по задуманной в предыдущем посте дичи. Пишу отдельным, чтоб увидел @DmitryAk и с радостью бы послушал @amyboose или @Adigen.

Вообщем, получилось запустить асинхронно вложенный шаблон с помощью такой вот конструкции:

Общий код:
C#:
using System.Threading.Tasks;

namespace ZennoLab.OwnCode
{
    public class Runner {
        public static void Inner(IZennoPosterProjectModel project) {
            var mapVars = new List<Tuple<string, string>>();
            mapVars.Add(new Tuple<string, string>("var1", "IN_var1")); // маппинг переменных из родительского шаблона => в дочерний
            string project_path = Path.Combine(project.Directory, "template_name.xmlz"); // имя дочернего шаблона
            project.ExecuteProject(project_path, mapVars, true, false, false);
        }
     
        public static void Run(IZennoPosterProjectModel project) {
            System.Threading.Tasks.Task.Run(() => Inner(project));
        }
    }
}
C# сниппет:
C#:
Runner.Run(project);
Да, запускается он асинхронно и вроде как отрабатывает до конца, при этом не блокируя родительский процесс. Но меня, конечно, очень смущает эта идея уже :-) Сделал её уже просто из спортивного интереса, но, к моему сожалению, совсем не понимаю как оно будет распределяться по ядрам в случае ударной нагрузки? И есть ли какие-то таймауты, по которым может таск отвалится и недоработать? А память не потечет от такой дичи?
Уже не говорю про то, что нужно точно знать завершился таск до конца или нет, т.к. по счастливой случайности в конце я пишу файл, который можно потом будет почекать.



mapVars.Add(new Tuple<string, string>("var1", "IN_var1")); // маппинг переменных из родительского шаблона => в дочерний



а как сделать после отработки возврат значение в родительский шаблон

mapVars.Add(new Tuple<string, string>("va2", "IN_var2")); маппинг переменных из до чернега <= в родительский шаблона
mapVars.Add(new Tuple<string, string>("va3", "IN_var3")); маппинг переменных из до чернега <= в родительский шаблона

если прервать работу шаблона должны прерваться все под проекты как такое сделать

заранее благодарю за помощь:bt:
 

Jab1Bot

Client
Регистрация
02.01.2021
Сообщения
5
Благодарностей
2
Баллы
3
-
 
Последнее редактирование:

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