Число активных потоков проекта

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
управление числом потоков на проданных шаблонах
А-а, ну значит небольшой +/- в количестве активных потоков особо не напрягает?
Выставлять лимит на максимум потоков не вариант?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
А-а, ну значит небольшой +/- в количестве активных потоков особо не напрягает?
Выставлять лимит на максимум потоков не вариант?
лимит обходится каким-нибудь батником или другим шаблоном
 
  • Спасибо
Реакции: Dimionix

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
Можно просто в начале шаблона проверять максимальное количество потоков и если оно больше определенного числа, то снижать или сразу нах отправлять:D (завершать поток).
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Можно просто в начале шаблона проверять максимальное количество потоков и если оно больше определенного числа, то снижать или сразу нах отправлять:D (завершать).
ну я за это и говорил. Количество потоков можно будет повышать батником, другим шаблоном
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
ну я за это и говорил. Количество потоков можно будет повышать батником, другим шаблоном
Так я понял, но т.к. количество потоков проверяется в начале шаблона, то вообще пофиг, сколько попытаются зарядить через батник, больше заданного количества работать не будут. Точнее будут запускаться, но сразу завершаться... с сообщением типа "Товарищ, а вы случаем не ох*ели, Вам же сказали, что максимум n потоков))".
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Так я понял, но т.к. количество потоков проверяется в начале шаблона, то вообще пофиг, сколько попытаются зарядить через батник, больше заданного количества работать не будут.
например, я запустил 100 потоков на запросах. Они все подхватились считай в один момент. 1й поток проверил лимит, увидел сотню, понизил до 10. Остальные 99 потоков увидели лимит 10 и успешно пошли далее.
Теория
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Почему бы тогда не сделать через БД?
Добавить столбец int thread, где значение по умолчанию - кол-во максимальных потоков. Пусть это будет 5.
При запуске шаблон проверят пользователя в таблице (создает или продолжает работу с ним) -> Чекаем thread > 0, а далее вычитаем 1 ед.
Да бы избежать недоразумений при остановке шаблоне или прерывании, сделать ещё один столбец, в котором будет храниться unix время последнего действия.
 
  • Спасибо
Реакции: doc

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Почему бы тогда не сделать через БД?
Добавить столбец int thread, где значение по умолчанию - кол-во максимальных потоков. Пусть это будет 5.
При запуске шаблон проверят пользователя в таблице (создает или продолжает работу с ним) -> Чекаем thread > 0, а далее вычитаем 1 ед.
Да бы избежать недоразумений при остановке шаблоне или прерывании, сделать ещё один столбец, в котором будет храниться unix время последнего действия.
Не того уровня задача, чтобы ради неё такие костыли городить)
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
например, я запустил 100 потоков на запросах. Они все подхватились считай в один момент. 1й поток проверил лимит, увидел сотню, понизил до 10. Остальные 99 потоков увидели лимит 10 и успешно пошли далее.
Теория
Ну да, согласен, в этом случае спасет глобальный счетчик. А вариант с завершением потока (+ можно добавить уменьшение максимального количества на единицу) или остановкой проекта и выводом сообщения сработает и, думаю, он самый простой.

ЗЫ. А разве в варианте с количеством активных потоков такой проблемы не возникнет?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Ну да, согласен, в этом случае спасет глобальный счетчик. А вариант с завершением потока (+ можно добавить уменьшение максимального количества на единицу) или остановкой проекта и выводом сообщения сработает и, думаю, он самый простой.

ЗЫ. А разве в варианте с количеством активных потоков такой проблемы не возникнет?
не должно. Потому что 100й поток увидит сотню и обрубится. 99й увидит 99 активных и т.д.
Ну увидел бы)
Глобальный счётчик теряет корректное значение, если проекты обрубить принудительно
 

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 885
Баллы
113
Я бы работал с глобальными тут.
Счетчик + время.
Сразу обрубаешь все лишние потоки и они просто не пойдут дальше. Можно, при привышении потоков, музычку ему играть, напеть, чтобы не наглел )
Если оборвал - у тебя есть информация, что прошло столько то времени, пусть подождёт, пока счетчик обнулится, после чего шаб опять запустится.
 
  • Спасибо
Реакции: doc

WebBot

Client
Регистрация
04.04.2015
Сообщения
1 763
Благодарностей
1 391
Баллы
113
Может я что-то не догнал, но почему просто не сделать список с привязкой к файлу и что бы каждый поток вначале работы проверял кол-во строк в этом списке и если оно меньше максимального разрешенного кол-ва потоков, то писал в него уникальную строку, а по завершении удалял ее ... ну а если больше то завершал бы поток. Тут можно сказать что мол с файлом легко делать всякие манипуляции типа удаления из него строк другим шаблоном, но можно поставить доп проверки .. если очередной поток в ходе работы не находит своей уникальной строки в списке, то завершает все работающие потоки
 
  • Спасибо
Реакции: doc

Gor

Client
Регистрация
30.09.2016
Сообщения
248
Благодарностей
30
Баллы
28
Приветствую. Тоже столкнулся с такой задачей. Все таки у вас получилось вернуть количество активных потоков?
 
Регистрация
15.04.2016
Сообщения
647
Благодарностей
107
Баллы
43
Приветствую. Тоже столкнулся с такой задачей. Все таки у вас получилось вернуть количество активных потоков?
Вот ещё вариант можешь попробовать


Код:
string task_name = TextProcessing.ToUpper(project.Name.Replace(".xmlz",""),"All"); //Сюда впиши название проекта, информацию по которому нужно получить, заменив project.Name.Replace(".xmlz",""), т.к. данная функция даёт количество активных потоков по текущему проекту
List<string> stats = ZennoPoster.TasksList.ToList();
for(int i = 0; stats.Count>i; i++)
{
  if(task_name==TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All"))
  {
    string potok = Regex.Match(stats[i].ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString();
//    project.SendErrorToLog(TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All")+" - активных потоков "+potok,true);
  return potok;
  }
}
 
  • Спасибо
Реакции: Кирилл412

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
Вот ещё вариант можешь попробовать


Код:
string task_name = TextProcessing.ToUpper(project.Name.Replace(".xmlz",""),"All"); //Сюда впиши название проекта, информацию по которому нужно получить, заменив project.Name.Replace(".xmlz",""), т.к. данная функция даёт количество активных потоков по текущему проекту
List<string> stats = ZennoPoster.TasksList.ToList();
for(int i = 0; stats.Count>i; i++)
{
  if(task_name==TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All"))
  {
    string potok = Regex.Match(stats[i].ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString();
//    project.SendErrorToLog(TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All")+" - активных потоков "+potok,true);
  return potok;
  }
}
Просто дня три рою, как вытащить колво активных потоков!!! Спасибо за пост
 

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
Просто дня три рою, как вытащить колво активных потоков!!! Спасибо за пост
Вот ещё вариант можешь попробовать


Код:
string task_name = TextProcessing.ToUpper(project.Name.Replace(".xmlz",""),"All"); //Сюда впиши название проекта, информацию по которому нужно получить, заменив project.Name.Replace(".xmlz",""), т.к. данная функция даёт количество активных потоков по текущему проекту
List<string> stats = ZennoPoster.TasksList.ToList();
for(int i = 0; stats.Count>i; i++)
{
  if(task_name==TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All"))
  {
    string potok = Regex.Match(stats[i].ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString();
//    project.SendErrorToLog(TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All")+" - активных потоков "+potok,true);
  return potok;
  }
}
ааа, не фигня.. максимальное колво потоков возвращает, а не активных
 
Регистрация
15.04.2016
Сообщения
647
Благодарностей
107
Баллы
43
ааа, не фигня.. максимальное колво потоков возвращает, а не активных
Вот доработанная версия, сделал @bsgun (telegram)

Код:
string task_name = TextProcessing.ToUpper(project.Name.Replace(".xmlz",""),"All"); // Получаем текущее имя проекта, из которого выполняется код.
// string task_name = "ROUNDCUBE"; // Сюда впиши название проекта, который ищем. При этом варианте можно мониторить кол-во потоков нужного проекта из другого шаба.
List<string> stats = ZennoPoster.TasksList.ToList();
for(int i = 0; stats.Count>i; i++)
{
  if(task_name==TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All"))
  {
    string potok = Regex.Match(stats[i].ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString();
//    project.SendErrorToLog(TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All")+" - активных потоков "+potok,true); // Раскомментируй эту строку, если нужно чтобы в лог выводились данные с названием проекта и кол-вом потоков.
  return potok;
  }
}

У тебя либо максимальное количество потоков = активному количеству потоков, либо активное количество потоков = оставшемуся количеству попыток

Смотри переменную stats.ToString(), парси её как тебе нужно и вычисляй
 
  • Спасибо
Реакции: Кирилл412

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
Вот доработанная версия, сделал @bsgun (telegram)

Код:
string task_name = TextProcessing.ToUpper(project.Name.Replace(".xmlz",""),"All"); // Получаем текущее имя проекта, из которого выполняется код.
// string task_name = "ROUNDCUBE"; // Сюда впиши название проекта, который ищем. При этом варианте можно мониторить кол-во потоков нужного проекта из другого шаба.
List<string> stats = ZennoPoster.TasksList.ToList();
for(int i = 0; stats.Count>i; i++)
{
  if(task_name==TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All"))
  {
    string potok = Regex.Match(stats[i].ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString();
//    project.SendErrorToLog(TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All")+" - активных потоков "+potok,true); // Раскомментируй эту строку, если нужно чтобы в лог выводились данные с названием проекта и кол-вом потоков.
  return potok;
  }
}

У тебя либо максимальное количество потоков = активному количеству потоков, либо активное количество потоков = оставшемуся количеству попыток

Смотри переменную stats.ToString(), парси её как тебе нужно и вычисляй
Спасибо, будем посмотреть.. Тот код возвращал именно макс потоков.., гонял и с активными и с безактивными )
 

Кирилл412

Пользователь
Регистрация
21.11.2018
Сообщения
146
Благодарностей
3
Баллы
18
Вот доработанная версия, сделал @bsgun (telegram)

Код:
string task_name = TextProcessing.ToUpper(project.Name.Replace(".xmlz",""),"All"); // Получаем текущее имя проекта, из которого выполняется код.
// string task_name = "ROUNDCUBE"; // Сюда впиши название проекта, который ищем. При этом варианте можно мониторить кол-во потоков нужного проекта из другого шаба.
List<string> stats = ZennoPoster.TasksList.ToList();
for(int i = 0; stats.Count>i; i++)
{
  if(task_name==TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All"))
  {
    string potok = Regex.Match(stats[i].ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString();
//    project.SendErrorToLog(TextProcessing.ToUpper(Regex.Match(stats[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All")+" - активных потоков "+potok,true); // Раскомментируй эту строку, если нужно чтобы в лог выводились данные с названием проекта и кол-вом потоков.
  return potok;
  }
}

У тебя либо максимальное количество потоков = активному количеству потоков, либо активное количество потоков = оставшемуся количеству попыток

Смотри переменную stats.ToString(), парси её как тебе нужно и вычисляй
http://joxi.ru/KAgjQ3LCEDJya2 этим кодом возвращает при любом раскладе 35, что есть максимальное число потоков
 

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