ZennoPoster.TasksList.ToList().ForEach(x=>project.Lists["список всех проектов в зенке"].Add(Regex.Match(x,@"(?<=<Name>).*?(?=</Name>)").Value));
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 5);
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
Добавить в конец 2 кубика и поставить выполнять 5 раз и 5 потоков?У меня шаб сначала работал по кругу, и мне приходилось прерывать шаблон. А теперь сделал, после завершения отрабатывает этот кубик.
А после этого, отрабатывает еще один кубикC#:var id = Guid.Parse(project.TaskId); ZennoPoster.SetTries(id, 5);
C#:var id = Guid.Parse(project.TaskId); ZennoPoster.AddTries(id, 1);
что значит на втором проходе ? шаблон закончил работу, вышел и запускается заного ? или у него внутренний цикл повтора ?Друзья подскажите в чем может быть проблема?
Запускаю проект в многопотоке, все норм запускается и проходит 1 цикл, но на втором проходе начинаются проблемы.
Если проект запустить например 5 выполнений в 5 потоков (т.е. 1 выполнение в 5 потоков) то все норм отработает, и если после завершения еще раз так же запустить, то норм отработает.
А вот если поставить например 10/15/100 выполнений и 5 потоков, то первый цикл из 5 потоков пройдет норм, а при повторе начнутся сбои.
Как можно избавиться от такой проблемы или можно как то автоматизировать повторный запуск после завершения выполнения.
Я не пробовал, в один кубик, да и в сишарпе не понимаю.Добавить в конец 2 кубика и поставить выполнять 5 раз и 5 потоков?
А если в 1 кубик все добавить?
Да. когда на второй цикл/проход идет после завершения. Может счетчик потоко неверно обрабатывает у меня, может потоки не завершились до конца и запускаются новые. А сбои думаю как раз из-за счетчика или нового потока идут. т.е. в мой код передает значение глобальной переменной.что значит на втором проходе ? шаблон закончил работу, вышел и запускается заного ?
ну впринципе идея хорошая. может сработать. Попробую. Главное чтобы с нуля пробовал запустить, как при первом запуске.Я не пробовал, в один кубик, да и в сишарпе не понимаю.
Первый кубик устанавливает 5 потоков, можно и 2 вместо 5 установить, второй кубик добавляет +1 выполнение.
Шаблон заканчивается, и запускается еще одно выполнение, и так всегда будет
неужели без лока ?Да. когда на второй цикл/проход идет после завершения. Может счетчик потоко неверно обрабатывает у меня, может потоки не завершились до конца и запускаются новые. А сбои думаю как раз из-за счетчика или нового потока идут. т.е. в мой код передает значение глобальной переменной.
локи не помогают. Без них и первый раз многопоток не запустился бы, Просто такое подозрение, что глобальная переменная неверно считает потоки или сбрасывает на ноль их. Уже разные варианты пробовал. Может где то уже затупил.неужели без лока ?
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();
}
lock(SyncObject) {
project.GlobalVariables.SetVariable("Глобал", "z", "");
return "Можно заходить другим";
}
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;
}
}
Спасибо. Глобальные переменные пробовал. Все равно неверно считает. Буду тестить добавление потоков и выполнений. Должно лучше сработать.Так можно управлять потоками
I know this is an old thread, but maybe there is a way to get running thread IDs as well?В 7.3.0.0 Добавили возможность получить кол-во активных потоков. Вот код:
C#:var Id = Guid.Parse(project.TaskId); int currentTaskThreadsById = ZennoPoster.GetThreadsCount(Id); return currentTaskThreadsById;
This allows to find out how many threads are running for certain task in zp.I know this is an old thread, but maybe there is a way to get running thread IDs as well?
Thank you.
@Mikhail B.Подскажите, а как получить именно заданное максимальное количество потоков, а не текущее активное?
Этот метод возвращает количество активных потоков, есть такой же для получения заданного максимального числа потоков?C#:ZennoPoster.GetThreadsCount(name_project);
Честно сказать я один раз сделал шаблон управлятор и больше его не трогал. По этому не компетентен в данном вопросе. Возможно кто-то из пользователей или администрации ответить сможет. Не исключено, что со времен написания статьи добавили что-то новое.@Mikhail B.
Есть решение данного вопроса?
Как это сделать?GetNumberOfTries - получить кол-во заданых исполнений
Обновлю информацию по задуманной в предыдущем посте дичи. Пишу отдельным, чтоб увидел @DmitryAk и с радостью бы послушал @amyboose или @Adigen.
Вообщем, получилось запустить асинхронно вложенный шаблон с помощью такой вот конструкции:
Общий код:
C# сниппет: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#:Runner.Run(project);
Уже не говорю про то, что нужно точно знать завершился таск до конца или нет, т.к. по счастливой случайности в конце я пишу файл, который можно потом будет почекать.