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

user100

Пользователь
Регистрация
13.12.2017
Сообщения
69
Благодарностей
17
Баллы
8
Допустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением ;-)
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113
  • Спасибо
Реакции: user100

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 925
Благодарностей
1 123
Баллы
113
Допустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением ;-)
Кстати интересная фича чтобы можно было из шаблона потоки задавать, напиши тут пост
 
  • Спасибо
Реакции: user100

user100

Пользователь
Регистрация
13.12.2017
Сообщения
69
Благодарностей
17
Баллы
8

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 925
Благодарностей
1 123
Баллы
113

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

user100

Пользователь
Регистрация
13.12.2017
Сообщения
69
Благодарностей
17
Баллы
8
Так требует тема) А то сломать можно )


Пару строк то черкните парни , как ограничить потоки в шаблоне до 20 )
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 099
Благодарностей
648
Баллы
113
Допустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением ;-)
Можно костыль запилить, но если клиент не дурак, он обойдет ограничение копированием шаблона n раз, выписывайте/продавайте зеннобокс 20 потоков из прошки, если нужно максимум 5 потоков, купите зеннопостер стандарт и выписывайте зеннобоксы через него. :bt:
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Желательно кодом, готовым решением
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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
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

RoyalBank

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

if (task_name != "название шаблона без .xmlz".ToLower()) throw new Exception("Нельзя переименовывать шаблон");
 
  • Спасибо
Реакции: tim.go и user100

maxmode

Client
Регистрация
17.12.2019
Сообщения
4
Благодарностей
0
Баллы
1
Проверка имени проекта, как пример:
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/ и т.д. без переименовывания?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Мешает ли что-нибудь распихать шаблон limit_20.xmlz по папкам 1/, 2/, 3/ и т.д. без переименовывания?
Как это относится, к теме поста? Я понимаю, что можно бесконечно набрасывать, и выкручиваться, но изначальный вопрос был об ограничении количества потоков.

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

Rk61

Client
Регистрация
03.02.2015
Сообщения
114
Благодарностей
126
Баллы
43
Первый варик, железобетонный, привязывать каждого клиента к своей базе MySQL.
На старте каждый шаблон спрашивает у сервера, сколько потоков уже запущено, если меньше допустимого, то стартует поток и в базе увеличивает кол-во потоков.

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

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

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

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

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

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

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

user100

Пользователь
Регистрация
13.12.2017
Сообщения
69
Благодарностей
17
Баллы
8
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())); // тут выводишь ошибку
}
Подскажи пожалуйста, как подправить код, пишет:
Входная строка имела не верный формат
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Подскажи пожалуйста, как подправить код, пишет:
Входная строка имела не верный формат
Так должно работать, для кода необходимо было сделать проверку на имя шаблона, чтобы брать количество потоков для конкретного шаблона.

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

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
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

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Там ошибка, замени строку
string project_name = project.Name.Replace(".xmlz","");
на
string project_name = project.Name.Replace(".xmlz","").ToLower();
 
Последнее редактирование:
  • Спасибо
Реакции: user100

user100

Пользователь
Регистрация
13.12.2017
Сообщения
69
Благодарностей
17
Баллы
8
поставил

int threads_limit = 3;

Разгоняется до 10 потоков - легко :-)
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Последнее редактирование:

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
ох, в зенке вроде не отдает колво потоков которые в работе, на мой код можешь забить, я проверял по NumberOfTries, (сколько делать), а почему то подумал что это количество запущенных потоков, колупать сейчас не буду, мб кто то подскажет тебе
 
  • Спасибо
Реакции: user100

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Отписал в саппорт за колво запущенных потоков мб ответят, а то на форуме ничего не нашел
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

user100

Пользователь
Регистрация
13.12.2017
Сообщения
69
Благодарностей
17
Баллы
8
Сейчас ограничивает потоки. То что нужно.
 

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
Давно сделал на глобалках используя сниппет ростоникса для распределения потоков в разные ветки. Минус метода надо обнулять глобалку если работа завершилась с ошибкой или была прервана.

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

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Ответил саппорт, скинули чуть не то, это проверка общего колва запущенных потоков по всем шаблонам в 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]
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Давно сделал на глобалках используя сниппет ростоникса для распределения потоков в разные ветки. Минус метода надо обнулять глобалку если работа завершилась с ошибкой или была прервана.

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

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

Mikhail B.

Client
Регистрация
23.12.2014
Сообщения
14 419
Благодарностей
5 454
Баллы
113
минус метода, что обнулять переменную можешь не только ты)

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

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Последнее редактирование:

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