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

  • Автор темы Автор темы DmitryAk
  • Дата начала Дата начала
C#:
Развернуть Свернуть Копировать
ZennoPoster.TasksList.ToList().ForEach(x=>project.Lists["список всех проектов в зенке"].Add(Regex.Match(x,@"(?<=<Name>).*?(?=</Name>)").Value));
 
Друзья подскажите в чем может быть проблема?

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

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

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

Как можно избавиться от такой проблемы или можно как то автоматизировать повторный запуск после завершения выполнения.
 
У меня шаб сначала работал по кругу, и мне приходилось прерывать шаблон. А теперь сделал, после завершения отрабатывает этот кубик.
C#:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 5);
А после этого, отрабатывает еще один кубик
C#:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
 
  • Спасибо
Реакции: Greez и radv
У меня шаб сначала работал по кругу, и мне приходилось прерывать шаблон. А теперь сделал, после завершения отрабатывает этот кубик.
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 кубик все добавить?
 
Друзья подскажите в чем может быть проблема?

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

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

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

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

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

Вложения

Так можно управлять потоками
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
Так можно управлять потоками
Спасибо. Глобальные переменные пробовал. Все равно неверно считает. Буду тестить добавление потоков и выполнений. Должно лучше сработать.
 
В 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.
 
Подскажите, а как получить именно заданное максимальное количество потоков, а не текущее активное?
C#:
Развернуть Свернуть Копировать
ZennoPoster.GetThreadsCount(name_project);
Этот метод возвращает количество активных потоков, есть такой же для получения заданного максимального числа потоков?
@Mikhail B.
Есть решение данного вопроса?
 
@Mikhail B.
Есть решение данного вопроса?
Честно сказать я один раз сделал шаблон управлятор и больше его не трогал. По этому не компетентен в данном вопросе. Возможно кто-то из пользователей или администрации ответить сможет. Не исключено, что со времен написания статьи добавили что-то новое.
 
Обновлю информацию по задуманной в предыдущем посте дичи. Пишу отдельным, чтоб увидел @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:
 

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