Ограничить потоки в шаблоне.

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

user100

Пользователь
Регистрация
13.12.2017
Сообщения
72
Реакции
18
Баллы
8
Допустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением ;-)
 
Допустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением ;-)
Кстати интересная фича чтобы можно было из шаблона потоки задавать, напиши тут пост
 
  • Спасибо
Реакции: user100
зачем так жестко ограничивать клиентов ? самый лучший способ под расписку с печатью *HAHA*
 
Так требует тема) А то сломать можно )


Пару строк то черкните парни , как ограничить потоки в шаблоне до 20 )
 
Допустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением ;-)
Можно костыль запилить, но если клиент не дурак, он обойдет ограничение копированием шаблона n раз, выписывайте/продавайте зеннобокс 20 потоков из прошки, если нужно максимум 5 потоков, купите зеннопостер стандарт и выписывайте зеннобоксы через него. :bt:
 
Желательно кодом, готовым решением
ZennoPoster 5.35.0.0 (30.09.2019)
[+] Добавлен метод ZennoPoster.SetMaxThreads

Если в ранней версии, то через костыль делать проверку

C#:
Развернуть Свернуть Копировать
int n = 5; // допустимое количество потоков

List<string> tasks = ZennoPoster.TasksList.ToList(); // получаешь список тасков
string lot = Regex.Match(tasks.ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString(); // тут получаешь текущее значение для количества потоков

if (Convert.ToInt32(lot) > n) {
    throw new Exception(String.Format("Количество потоков не должно превышать: {0}", n.ToString())); // тут выводишь ошибку
}

ЗЫ, код набросал из кусков, дальше сделай у себя чтобы работало.
 
  • Спасибо
Реакции: tim.go и user100
ZennoPoster 5.35.0.0 (30.09.2019)
[+] Добавлен метод ZennoPoster.SetMaxThreads

Если в ранней версии, то через костыль делать проверку

C#:
Развернуть Свернуть Копировать
int n = 5; // допустимое количество потоков

List<string> tasks = ZennoPoster.TasksList.ToList(); // получаешь список тасков
string lot = Regex.Match(tasks.ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString(); // тут получаешь текущее значение для количества потоков

if (Convert.ToInt32(lot) > n) {
    throw new Exception(String.Format("Количество потоков не должно превышать: {0}", n.ToString())); // тут выводишь ошибку
}

ЗЫ, код набросал из кусков, дальше сделай у себя чтобы работало.
что мешает раскопировать шаблон 20 раз и запускать по 5 потоков ?
 
  • Спасибо
Реакции: user100
что мешает раскопировать шаблон 20 раз и запускать по 5 потоков ?
Проверка имени проекта, как пример:
C#:
Развернуть Свернуть Копировать
string task_name = TextProcessing.ToLower(project.Name.Replace(".xmlz",""),"All"); // Получаем текущее имя проекта, из которого выполняется код.

if (task_name != "название шаблона без .xmlz".ToLower()) throw new Exception("Нельзя переименовывать шаблон");
 
  • Спасибо
Реакции: tim.go и user100
Проверка имени проекта, как пример:
C#:
Развернуть Свернуть Копировать
string task_name = TextProcessing.ToLower(project.Name.Replace(".xmlz",""),"All"); // Получаем текущее имя проекта, из которого выполняется код.

if (task_name != "название шаблона без .xmlz".ToLower()) throw new Exception("Нельзя переименовывать шаблон");
Мешает ли что-нибудь распихать шаблон limit_20.xmlz по папкам 1/, 2/, 3/ и т.д. без переименовывания?
 
Мешает ли что-нибудь распихать шаблон limit_20.xmlz по папкам 1/, 2/, 3/ и т.д. без переименовывания?
Как это относится, к теме поста? Я понимаю, что можно бесконечно набрасывать, и выкручиваться, но изначальный вопрос был об ограничении количества потоков.

Что касается вашего вопроса, то можно продумать множество способов, как ограничить запуск шаблона, самое простое решение, это привязка работы шаблона к конкретному пути, к примеру, "C:\MyProjectName\ProjectName.xmlz"
 
Первый варик, железобетонный, привязывать каждого клиента к своей базе MySQL.
На старте каждый шаблон спрашивает у сервера, сколько потоков уже запущено, если меньше допустимого, то стартует поток и в базе увеличивает кол-во потоков.

Второй варик - через локальный файл с шифрованием.

Третий варик - глобальные переменные

Четвёртый варик - создавать файл у клиента в месте отличном от папки шаблона (типа в системных папках)

Пятый варик - хранить кол-во потоков в реестре клиента.

Шестой варик - проверять кодом кол-во запущенных потоков. Но в этом случае я бы в начале шаблона проверял имя шаблона, чтоб его не переименовывали, тогда можно будет отыскать все раскопированные шаблоны. Либо выписывать шаблон через ЛК зенки, тогда можно будет быть уверенным, что только 1 копия у клиента.

Но стоит обязательно учесть, чтоб при старте шаблона проверял, вдруг есть "зависшие потоки", чтоб в конце тоже обязательно "закрывал" поток в базе.

Я написал самые очевидные варианты.
В общем вариантов куча, выбираешь, какой тебе подходит более всего и юзаешь .
 
  • Спасибо
Реакции: Master4eg и Metrix
C#:
Развернуть Свернуть Копировать
int n = 5; // допустимое количество потоков

List<string> tasks = ZennoPoster.TasksList.ToList(); // получаешь список тасков
string lot = Regex.Match(tasks.ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString(); // тут получаешь текущее значение для количества потоков

if (Convert.ToInt32(lot) > n) {
    throw new Exception(String.Format("Количество потоков не должно превышать: {0}", n.ToString())); // тут выводишь ошибку
}
Подскажи пожалуйста, как подправить код, пишет:
Входная строка имела не верный формат
 
Подскажи пожалуйста, как подправить код, пишет:
Входная строка имела не верный формат
Так должно работать, для кода необходимо было сделать проверку на имя шаблона, чтобы брать количество потоков для конкретного шаблона.

C#:
Развернуть Свернуть Копировать
int n = 5;

List<string> tasks = ZennoPoster.TasksList.ToList();

for(int i = 0; tasks.Count > i; i++)
{
    if(TextProcessing.ToLower(project.Name.Replace(".xmlz",""),"All") == TextProcessing.ToLower(Regex.Match(tasks[i].ToString(),@"(?<=<Name>).*?(?=</Name>)").ToString(),"All"))
    {
        string lot = Regex.Match(tasks.ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").ToString();
        if (Convert.ToInt32(lot) > n) throw new Exception(String.Format("Количество потоков не должно превышать: {0}", n.ToString()));
    }
}
 
  • Спасибо
Реакции: user100
C#:
Развернуть Свернуть Копировать
//название шаблона который будем выдавать
string template_name = "test_limit".Replace(".xmlz","").ToLower();
//Максимальное колво потоков
int threads_limit = 5;



string project_name = project.Name.Replace(".xmlz","").ToLower();
if (template_name != project_name) throw new Exception("Нельзя переименовывать шаблон");

var tasksList = ZennoPoster.TasksList;
//Обнуляем счетчик потоков
int all_threads = 0;
foreach (var task in tasksList){ 
    string tname = Regex.Match(task,@"(?<=<Name>).*?(?=</Name>)").Value.ToLower();

    if(tname == template_name)
    {
         //получаем колво потоков
        int threads = Convert.ToInt32(Regex.Match(task.ToString(),@"(?<=<NumberOfTries>).*?(?=</NumberOfTries>)").Value);
        //return threads;
        //суммируем потоки для шаблонов с одинаковым названием
        all_threads=all_threads+threads;
    }
    project.SendInfoToLog(tname);
}

if(all_threads>=threads_limit) throw new Exception("Привышенно максимальное количество потоков, лимит: "+Convert.ToString(threads_limit));

PS поправил ошибку
 
Последнее редактирование:
  • Спасибо
Реакции: user100
Там ошибка, замени строку
string project_name = project.Name.Replace(".xmlz","");
на
string project_name = project.Name.Replace(".xmlz","").ToLower();
 
Последнее редактирование:
  • Спасибо
Реакции: user100
поставил

int threads_limit = 3;

Разгоняется до 10 потоков - легко :-)
 
ох, в зенке вроде не отдает колво потоков которые в работе, на мой код можешь забить, я проверял по NumberOfTries, (сколько делать), а почему то подумал что это количество запущенных потоков, колупать сейчас не буду, мб кто то подскажет тебе
 
  • Спасибо
Реакции: user100
Отписал в саппорт за колво запущенных потоков мб ответят, а то на форуме ничего не нашел
C#:
Развернуть Свернуть Копировать
//название шаблона который будем выдавать
string template_name = "test_limit".Replace(".xmlz","").ToLower();
//Максимальное колво потоков
int threads_limit = 3;

string project_name = project.Name.Replace(".xmlz","").ToLower();
if (template_name != project_name) throw new Exception("Нельзя переименовывать шаблон");

var tasksList = ZennoPoster.TasksList;
//Обнуляем счетчик потоков
int all_threads = 0;
int template_count = 0;
foreach (var task in tasksList){
    string tname = Regex.Match(task,@"(?<=<Name>).*?(?=</Name>)").Value.ToLower();

    if(tname == template_name)
    {
      template_count=template_count+1;

        //получаем колво потоков
        int threads = Convert.ToInt32(Regex.Match(task.ToString(),@"(?<=<LimitOfThreads>).*?(?=</LimitOfThreads>)").Value);
        //return task;
        project.SendInfoToLog(Convert.ToString(threads));
        //return threads;
        //суммируем потоки для шаблонов с одинаковым названием
        all_threads=all_threads+threads;
    }
    //project.SendInfoToLog(Convert.ToString(all_threads));
   // project.SendInfoToLog(tname);
}
//project.SendInfoToLog(Convert.ToString(template_amount));
if(template_count >1)throw new Exception("Разрешенно использование только 1 шаблона одновременно");
if(all_threads>threads_limit) throw new Exception("Привышенно максимальное количество потоков, лимит: "+Convert.ToString(threads_limit));
Сделал чуть иначе, проверь пожалуйста как у тебя будет работать, добавил запрет на второй шаблон и проверка на колво максимальных потоков стоит, так поидее должно быть нормально, возможно что то мог упустить
 
Последнее редактирование:
  • Спасибо
Реакции: user100
Сейчас ограничивает потоки. То что нужно.
 
Давно сделал на глобалках используя сниппет ростоникса для распределения потоков в разные ветки. Минус метода надо обнулять глобалку если работа завершилась с ошибкой или была прервана.

Взломать нельзя ограничение, копирование шаблонов ничего не даст кроме ошибок.
 
Ответил саппорт, скинули чуть не то, это проверка общего колва запущенных потоков по всем шаблонам в ZP

var stats = Global.Statistics.StatsCollector.Instance.DataSource;
return stats.Where(kv=>kv.Key==Global.Statistics.StatType.WorkingThreads).Select(kv=>kv.Value).FirstOrDefault();

Решил запостить в эту тему, вдруг пригодится кому то, инфа там такая, повторюсь, по всему zp:

[WorkingThreads, 31]
[CompiledProjects, 200]
[DbManagerAllProxy, 0]
[DbManagerReadyProxy, 0]
[PpManagerLastCacheUpdate, 01.01.0001 0:00:00]
[MainControlEvents, 3]
[PcManagerMainState, 0]
[PcManagerPutToAlive, 2581]
[PcManagerAliveCount, 2581]
[TaskCategoryEvents, 9]
[TaskControlEvents, 6]
[PcManagerCancelCheck, 0]
[CheckingProcessors, CheckingProcessor0:0]
[PcManagerGetFromCheck, 0]
[TaskManagerCountOfThreads, 41]
 
Последнее редактирование:
Давно сделал на глобалках используя сниппет ростоникса для распределения потоков в разные ветки. Минус метода надо обнулять глобалку если работа завершилась с ошибкой или была прервана.

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

Методов много, в том числе те, которые тут обсуждали. Какие-то проще, какие-то сложнее. Но пока зеннопостер не научится отдавать циферку активных потоков шаблона - всё костыли
 
  • Спасибо
Реакции: molotok
минус метода, что обнулять переменную можешь не только ты)

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

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