Как добавить(+1)/уменьшить(-1) количество потоков в процессе выполнения?

  • Автор темы Автор темы Enigma
  • Дата начала Дата начала

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Реакции
31
Баллы
28
В настройках создания батника есть возможность установить конкретное значение количества потоков. А как добавить +1 поток к текущему количеству? И как уменьшить? Вероятно, через C# код, подскажите, пожалуйста как именно.
 
Спасибо большое за указанное направление :-)

Поскольку чукча не программист знаний не хватает в таких вещах, тяжко пользоваться подобной документацией, хотелось бы конкретный пример на С# :-) Поделитесь, пожалуйста, если это, конечно, сравнительно не сложная задача (для моего уровня, например, весьма сложная).

В идеале, чтобы использовался по имени, а не по id, т.к. насколько я понимаю id проекта меняется после правки в PM
 
Последнее редактирование:
чукча не программист
Поможем малочисленным народам крайнего севера. :D
Код:
Развернуть Свернуть Копировать
string settings = "<LimitOfThreads>1</LimitOfThreads>" //этот параметр устанавливает нужное число потоков, соответственно тебе их нужно указать
                + "<MaxAllowOfThreads>0</MaxAllowOfThreads>"
                + "<DoneSuccesfully>0</DoneSuccesfully>"
                + "<DoneAll>0</DoneAll>"
                + "<NumberOfTries>0</NumberOfTries>" // это число выполнений
                + "<LastNumberOfTries>0</LastNumberOfTries>"
                + "<Priority>50</Priority>"
                + "<Proxy>{DoNotUseProxy, IfPossible, UseProxyWithoutRemove, UseProxy}</Proxy>"
                + "<Status>Newbie</Status>"
                + "<ProxyLabels></ProxyLabels>"
                + "<ShouldBeExecutedRandomly>{True, False}</ShouldBeExecutedRandomly>"
                + "<GroupLabels>Без метки</GroupLabels>"
                + "<GroupStates>Выполнены</GroupStates>"
                + "<MaxNumOfSuccesStop>-1</MaxNumOfSuccesStop>"
                + "<MaxNumOfFailStop>-1</MaxNumOfFailStop>"
                + "<NumOfFailStop>0</NumOfFailStop>";


ZennoPoster.SetExecutionSettings(Guid.Parse(project.TaskId), settings); // применит настройки к текущему шаблону
ZennoPoster.SetExecutionSettings("НазваниеШаблона", settings); // применит настройки к шаблону по имени
 
  • Спасибо
Реакции: Alex733 и Enigma
Ух ты:) Спасибо, начинает что-то вырисовываться!
Похоже, в параметр LimitOfThreads нужно указать конкретное число потоков (по аналогии с настройками при создании батника).
А как именно добавить/отнять 1 поток? Нужно для начала получить текущее количество потоков, затем прибавить/отнять 1, положить получившееся число в переменную и вставить в приведенный код выше?
 
Если управление текущим шабом, то проще так:
Добавить 1 поток
C#:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.AddTries(id, 1);
Обнулить кол-во
C#:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 0);
Установить 5 потоков исполнения
C#:
Развернуть Свернуть Копировать
var id = Guid.Parse(project.TaskId);
ZennoPoster.SetTries(id, 5);

PS: так довольно удобно рулить кол-вом потоков на основе данных из бд.
Запустили один поток - он получил из бд кол-во данных которое надо обработать и установил себе это кол-во. Ессно необходимо учесть блокировку запрашиваемых данных и шаб должен быть не зациклен.. т.е получил данные для обработки - обработал - завершился.
 
Не могу понять, как получить актуальное количество работающих потоков в переменную. Не всех проектов, а конкретного, по имени шаблона. Кучу тем уже перерыл, но везде мысль либо не закончена, либо пути ведут снова на "страшные" страницы документации :-)
 
  • Спасибо
Реакции: kagorec и stud
как получить актуальное количество потоков в переменную
List<string> xmlList = ZennoPoster.TasksList().ToList();

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

string xml = ZennoPoster.GetTaskInfo(Guid.Parse("GUID"));
 
  • Спасибо
Реакции: evgen_po
AddTries- это добавление нужного количества выполнений!
SetTries - это установка нужного количества выполнений!
Разница в сленге). Для меня "установить кол-во потоков" = "установить кол-во выполнений".
Добавить потоков и установить максимум потоков - это разные вещи, прекрасно это понимаю)
 
Всем спасибо за ответы.
Пока что остановился на таком варианте.

Сначала подсчитываю актуальное количество потоков, сохраняю в переменную potokov_now

Код:
Развернуть Свернуть Копировать
var tasksList = new List<string>(ZennoPoster.TasksList);
var id = new Guid(project.TaskId);
for (int i=0; i<tasksList.Count; i++) {
   if (tasksList[i].Contains("<Id>"+id +"</Id>")) {
     return Regex.Match(tasksList[i], @"(?<=LimitOfThreads>)\d+(?=</LimitOfThreads>)").Value;
   }
}

Прибавляю единицу (либо отнимаю, в зависимости от ситуации), получаю переменную potokov_nado

Затем запускаю батник, прописывая переменные нужного количества потоков и имени проекта:

pwBMkL.jpg

Пока все устраивает, кроме одного момента. Иногда прямо очень нужно узнать актуальное количество потоков соседнего проекта (а не текущего), т.е. по имени проекта, а не по id. Люди добрые, плиз, скиньте рабочий код для получения кол-ва потоков по имени проекта (выше код для получения по TaskId). Кусками кода из документации пользоваться не умею, к сожалению.
 
  • Спасибо
Реакции: Donalddick
AddTries- это добавление нужного количества выполнений!
SetTries - это установка нужного количества выполнений!

Очень жаль, что не существует какого-нибудь MinusTries, чтобы можно было онять нужное количество выполнений:)
 
Очень жаль, что не существует какого-нибудь MinusTries, чтобы можно было онять нужное количество выполнений:-)
от текущего трайс отнимаешь свой МнусТрайс и получаешь число для СетТрайс)
 
Чуть чуть математики и SetTries

Ну и можно минусовое значение в AddTries передать.. хз правда сработает ли - лень проверять.

Иногда прямо очень нужно узнать актуальное количество потоков соседнего проекта
Готовый код не дам, но направлю:
Получаем список проектов, перебираем их ищем поле Name если оно соответствует имени шаба - проверяем ExecutionSettings.NumberOfTries - это и есть кол-во исполнений
 
В настройках создания батника есть возможность установить конкретное значение количества потоков. А как добавить +1 поток к текущему количеству? И как уменьшить? Вероятно, через C# код, подскажите, пожалуйста как именно.
Есть готовое решение.
В бенчмарке от Lord_Alfred реализовано, ставишь 1 поток, а шаблон сам запускает количество потоков равное количеству процессоров.
Можно разобрать шаблон и подсмотреть нужное.
http://zennolab.com/discussion/thre...er-zennojsbench-u-kogo-moschnee-server.39798/
 
от текущего трайс отнимаешь свой МнусТрайс и получаешь число для СетТрайс)

Это понятно, я так и делаю сейчас:-) Тогда и AddTries ни к чему (грубо говоря), можно ж аналогично через арифметику и SetTries обыграть:-)
 
Последнее редактирование:
Чуть чуть математики и SetTries

Ну и можно минусовое значение в AddTries передать.. хз правда сработает ли - лень проверять.

К сожалению, не сработало :-) В зенке меньше нуля не дает установить попытки, а если отредактировать батник, то в итоге установится непосредственно "-1".

Чуть чуть математики и SetTries

Готовый код не дам, но направлю:
Получаем список проектов, перебираем их ищем поле Name если оно соответствует имени шаба - проверяем ExecutionSettings.NumberOfTries - это и есть кол-во исполнений

А как получить список проектов? Код, который выше предоставил ZHAG, у меня выполняется выполняется с ошибкой (видимо, нужно еще какие-то параметры указать, а я ж бамбук, просто копипаст делаю):

Код:
Развернуть Свернуть Копировать
List<string> xmlList = ZennoPoster.TasksList().ToList();
 
Это понятно, я так и делаю сейчас:-) Тогда и AddTries ни к чему (грубо говоря), можно ж аналогично через арифметику и SetTries обыграть:-)
да, но добавить число попыток задача куда более востребована, чем отнять
 
  • Спасибо
Реакции: Андрейка2020
  • Спасибо
Реакции: Enigma
Ошибку действительно не выдает теперь. Теперь не пойму, как этот код использовать на практике. В какой список добавится информация, нужно ли объявить имя списка в коде? Вроде простая задача, а я застрял в ней из-за непонимания базовых вещей, сорри. Когда вы скидываете "направление", явно рассчитываете на хотя бы средний уровень знаний кода, но спешу Вас разочаровать :bh:
И еще: в PM этот код должен ведь сработать, получит ли он информацию от запущенного ZP?
 
И еще: в PM этот код должен ведь сработать, получит ли он информацию от запущенного ZP?
да получит.
Когда вы скидываете "направление", явно рассчитываете на хотя бы средний уровень знаний кода, но спешу Вас разочаровать :bh:
Ну дружища..... у тебя есть 2 пути:
1. забить на свою хотелку.
2. Учить базис програмирования :)

Из той инфы которую тебе здесь предоставили можно уже собрать шаблон упровляющий всеми остальными :).
 
  • Спасибо
Реакции: DmitryAk
Из той инфы которую тебе здесь предоставили можно уже собрать шаблон упровляющий всеми остальными :-).

Для этого мне как раз не хватает пару паззлов :) Закрыть их и тогда картинка сложится ;) Если не сложно, сориентируйте, пожалуйста, по этому вопросу:

"В какой список добавится информация, нужно ли объявить имя списка в коде?"
 
Когда вы скидываете "направление", явно рассчитываете на хотя бы средний уровень знаний кода, но спешу Вас разочаровать :bh:
Какой средний? Это даже на кубиках собрать можно и парой строчек на шарпе.
В общем путь осилит идущий..
 
Код:
Развернуть Свернуть Копировать
List<string> xmlList = ZennoPoster.TasksList.ToList();

Объясните плиз на пальцах где сохраняется инфа после выполнения этого кода. Переменная возвращает "ok".
 
Апну тему немного.

1) как распарсить список? В данном случае для выявления Id по и имени. В т.ч. сложность из-за пункта 2.
2) там несколько Id указано. Брать первый?
 
Вот пример строки списка. Естественно там все не отформатировано, а в одну строку уложено. )

Код:
Развернуть Свернуть Копировать
<Id>d568a8dd-92d2-41db-98a3-bd6597d10812</Id>
<Name>project</Name>
<IsNewbie>True</IsNewbie>
<IsEnable>True</IsEnable>
<CreateTime>01/01/2019 20:50:36</CreateTime>
<SettingsType>None</SettingsType>

<ExecutionSettings>
    <Id>e9950807-dc9d-4216-a614-2ea84b6c6471</Id>
    <LimitOfThreads>1</LimitOfThreads>
    <MaxAllowOfThreads>0</MaxAllowOfThreads>
    <DoneSuccesfully>4</DoneSuccesfully>
    <DoneAll>4</DoneAll>
    <NumberOfTries>96</NumberOfTries>
    <LastNumberOfTries>100</LastNumberOfTries>
    <Priority>50</Priority>
    <Proxy>DoNotUseProxy</Proxy>
    <Status>Perform</Status>
    <ProxyLabels></ProxyLabels>
    <ShouldBeExecutedRandomly>False</ShouldBeExecutedRandomly>
    <GroupLabels></GroupLabels>
    <GroupStates>Выполняются</GroupStates>
    <MaxNumOfSuccesStop>-1</MaxNumOfSuccesStop>
    <Timeout>-1</Timeout>
    <MaxNumOfFailStop>-1</MaxNumOfFailStop>
    <NumOfFailStop>0</NumOfFailStop>
    <ShowTask>False</ShowTask>
    <TraceTask>False</TraceTask>
</ExecutionSettings>

<SchedulerSettings>
    <Id>f750b50f-6cdc-4a01-b893-b61a72fad438</Id>
    <StartDate>01/02/2019 20:50:00</StartDate>
    <ShedulerOnDate>01/02/2019 13:29:00</ShedulerOnDate>
    <EndDate>01/01/2020 20:50:00</EndDate>
    <RepetitionCount>1</RepetitionCount>
    <ScheduleType>EveryDays</ScheduleType>
    <RepeatType>WithoutEnd</RepeatType>
    <ActivateTime>01/01/0001 10:00:00</ActivateTime>
    <ActivateWorkTime>01/01/0001 00:00:00</ActivateWorkTime>
    <IsActive>True</IsActive>
    <NumberOfTries>100</NumberOfTries>
    <Minutes>1</Minutes>
    <Days>1</Days>
    <LastScheduleDate>01/01/0001 00:00:00</LastScheduleDate>
    <NextScheduleDate>01/03/2019 10:00:00</NextScheduleDate>
    <IsClearSucces>False</IsClearSucces>
    <GroupName></GroupName>
</SchedulerSettings>

<TriggerSettings>
    <Id>c9382794-e262-45b3-a659-54f896c38876</Id>
    <CheckFileExistanse>False</CheckFileExistanse>
    <CheckFilePath></CheckFilePath>
    <RemoveCheckFile>True</RemoveCheckFile>
    <NumberOfTries>0</NumberOfTries>
    <IsClearSucces>False</IsClearSucces>
</TriggerSettings>

<Project>
    <ProjectFileLocation>C:\Users\Egor\Documents\ZennoLab\projects\project.xmlz</ProjectFileLocation>
    <ProjectType>Assembly</ProjectType>
</Project>

<PurchaseState>None</PurchaseState>
 
Последнее редактирование:
А максимум потоков можно регулировать из кода? На подобии как добавлять исполнения.

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

ZennoPoster_2019-07-28_13-11-39.png
 

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