Есть ли возможность получить общее количество запущенных потоков для всех проектов?

Bas

Client
Регистрация
15.12.2013
Сообщения
636
Благодарностей
263
Баллы
63
Добрый день. Собственно сабж, есть ли возможность получить в переменную общее количество запущенных потоков для всех проектов?
Проще говоря вот это значение:
109582
С целью автоматически балансировать нагрузку между серверами.

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

Dmitriy Ka

Client
Регистрация
03.05.2016
Сообщения
773
Благодарностей
517
Баллы
93
Добрый день. Собственно сабж, есть ли возможность получить в переменную общее количество запущенных потоков для всех проектов?
Проще говоря вот это значение:
Посмотреть вложение 109582
С целью автоматически балансировать нагрузку между серверами.

Как получить количество запущенных потоков для конкретного GUID - такой метод есть, а вот общего количества - нету. Или хотя бы метод для получения всех GUID чтобы их перебрать в цикле и из каждого вынуть нужную информацию о количестве потоков... В общем прошу помощи.
Думаю вот это поможет:
 

Bas

Client
Регистрация
15.12.2013
Сообщения
636
Благодарностей
263
Баллы
63
AllInstances - не подходит, проекты безбраузерные. А второй - что-то не получается ничего, 0 выдает и в ПМ и в ЗП :( Чуть позже скину код который получился, пока отъехал далеко, через пару дней буду за компом.
 

Bas

Client
Регистрация
15.12.2013
Сообщения
636
Благодарностей
263
Баллы
63
Может кому пригодится:

C#:
int totalThreads = 0;
var list = ZennoPoster.TasksList; //Получаем список со всеми проектами в ЗП
string pattern = @"(?<=<LimitOfThreads>).*(?=</LimitOfThreads>)"; //Регулярка на получение макс количества потоков проекта
string pattern_status = @"(?<=<Status>).*(?=</Status>)"; //Регулярка на получение статуса проекта

foreach (var her in list) //Перебираем список с проектами ЗП
{
    Match m = Regex.Match(her, pattern_status, RegexOptions.IgnoreCase); //Получаем статус проекта
    if (m.Value == "Perform")
    {
        m = Regex.Match(her, pattern, RegexOptions.IgnoreCase); //Получаем макс кол-во потоков для проекта
        totalThreads += Int32.Parse(m.Value);
    }
}

project.SendWarningToLog("Всего запущено потоков: " + totalThreads.ToString(), true);
Но возник другой вопрос, как получить максимально разрешенное количество потоков, суммарно для всех проектов, а не текущее активное количество, как делает этот код. Проблема в том что некоторые потоки могут находиться в стадии запуска и при подсчете количества потоков этим кодом они не будут учитываться. Замена LimitOfThreads на MaxAllowOfThreads ведет к выдаче стабильного "0" в качестве результата. Возможно баг ЗП и значение не записывается в свойства таска. Т.е. нужно получить сумму вот этих значений:109931. Есть у кого-то идеи как это сделать?
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 423
Баллы
113
как получить максимально разрешенное количество потоков, суммарно для всех проектов
Количество максимальных показывает как раз LimitOfThreads
109940
C#:
return ZennoPoster.TasksList.Sum(task=>
    int.Parse(Regex.Match(task, @"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").Value));
хотя бы метод для получения всех GUID
Так там же (в taskslist) и guid каждого добавленного проекта есть.
а не текущее активное количество, как делает этот код
Неправильно. тот код считает то, что и мой выше. А текущее количество запущенных потоков надо так
109939
C#:
return ZennoPoster.TasksList.Sum(task=>
    ZennoPoster.GetThreadsCount(Guid.Parse(Regex.Match(task, @"(?<=<Id>).*?(?=</Id>)").Value)));
 
Последнее редактирование:
  • Спасибо
Реакции: Bas

Bas

Client
Регистрация
15.12.2013
Сообщения
636
Благодарностей
263
Баллы
63
return ZennoPoster.TasksList.Sum(task=> ZennoPoster.GetThreadsCount(Guid.Parse(Regex.Match(task, @"(?<=<Id>).*?(?=</Id>)").Value)));
Этот код выполняется 2.5 минуты при 272 заданиях в ЗП, из которых активны 15.

return ZennoPoster.TasksList.Sum(task=> int.Parse(Regex.Match(task, @"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").Value));
Этот код возвращает 2655 при реально запущенных максимальных 148 потоках, из которых рабочих 131. Но в целом спасибо за наводку, регулярку чуть подкручу и будет в 1 строку, надеюсь не станет 2 минуты выполняться :-) Но я уже понял что и мой код корректно возвращает сумму, просто я считаю только статусы Perform, а надо еще и запланированные учитывать.
 
  • Спасибо
Реакции: Alexmd

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 423
Баллы
113
Этот код выполняется 2.5 минуты при 272 заданиях в ЗП, из которых активны 15.
У меня нет столько добавленных шаблонов, поэтому и не заметил, что операция выполнялась относительно долго. Но 2,5 минуты...
Провел замеры:
У меня 60 добавленных проектов
Все отрабатывает в пределах 1 секунды при любых комбинациях количества запущенных проектов с самым разным числом потоков, вплоть до упора в ресурсы сервера.


Прошу прощения, упустил важность статусов. Однако.
Вот обновленный код.
C#:
return ZennoPoster.TasksList
    .Where(task=> Regex.Match(task, @"(?<=<Status>).*?(?=</Status>)").Value == "Perform")
    .Sum(task=> ZennoPoster.GetThreadsCount(Guid.Parse(Regex.Match(task, @"(?<=<Id>).*?(?=</Id>)").Value)));
Таким образом, скорость еще заметно увеличилась, судя опять-таки, по моим замерам
Но зелененькое число не учитывает "Newbie", насколько я понимаю

при реально запущенных максимальных 148 потоках, из которых рабочих 131.
Тут я тоже не понял, что надо только запущенные считать и по умолчанию просто все посчитал во всей зенке. Ваш код считает тоже правильно, но считает не то, что Вы думаете.
C#:
return ZennoPoster.TasksList
    .Where(task=>
        {
            var status = Regex.Match(task, @"(?<=<Status>).*?(?=</Status>)").Value;
            return status == "Perform" || status == "Newbie";
        })
    .Sum(task=> int.Parse(Regex.Match(task, @"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").Value));
В общем, с условиями надо играться. Но сам функционал есть и работает.
 
  • Спасибо
Реакции: Bas

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
хотите скорости от регулярок - не пользуйтесь позитивным просмотром вперед/назад
 

Bas

Client
Регистрация
15.12.2013
Сообщения
636
Благодарностей
263
Баллы
63
return ZennoPoster.TasksList .Where(task=> Regex.Match(task, @"(?<=<Status>).*?(?=</Status>)").Value == "Perform") .Sum(task=> ZennoPoster.GetThreadsCount(Guid.Parse(Regex.Match(task, @"(?<=<Id>).*?(?=</Id>)").Value)));
Во, теперь 3-4 сек, гуд :-) Спасибо, пригодится.
 

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