Кстати интересная фича чтобы можно было из шаблона потоки задавать, напиши тут постДопустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением
А финансы то где ?)Кстати интересная фича чтобы можно было из шаблона потоки задавать, напиши тут пост
Выписывать только на зеннобокс, там максимум - 20.как ограничить потоки в шаблоне до 20 )
Можно костыль запилить, но если клиент не дурак, он обойдет ограничение копированием шаблона n раз, выписывайте/продавайте зеннобокс 20 потоков из прошки, если нужно максимум 5 потоков, купите зеннопостер стандарт и выписывайте зеннобоксы через него.Допустим я передаю шаблон человеку, и хочу чтоб он запускал его не более 20 потоков.
Как это реализовать.
Желательно кодом, готовым решением
ZennoPoster 5.35.0.0 (30.09.2019)Желательно кодом, готовым решением
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 потоков ?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 потоков ?
string task_name = TextProcessing.ToLower(project.Name.Replace(".xmlz",""),"All"); // Получаем текущее имя проекта, из которого выполняется код.
if (task_name != "название шаблона без .xmlz".ToLower()) throw new Exception("Нельзя переименовывать шаблон");
Мешает ли что-нибудь распихать шаблон limit_20.xmlz по папкам 1/, 2/, 3/ и т.д. без переименовывания?Проверка имени проекта, как пример:
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/ и т.д. без переименовывания?
Подскажи пожалуйста, как подправить код, пишет: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())); // тут выводишь ошибку }
Так должно работать, для кода необходимо было сделать проверку на имя шаблона, чтобы брать количество потоков для конкретного шаблона.Подскажи пожалуйста, как подправить код, пишет:
Входная строка имела не верный формат
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()));
}
}
//название шаблона который будем выдавать
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));
Когда на днях тестил работало, сейчас проверюпоставил
int threads_limit = 3;
Разгоняется до 10 потоков - легко
//название шаблона который будем выдавать
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));
минус метода, что обнулять переменную можешь не только ты)Давно сделал на глобалках используя сниппет ростоникса для распределения потоков в разные ветки. Минус метода надо обнулять глобалку если работа завершилась с ошибкой или была прервана.
Взломать нельзя ограничение, копирование шаблонов ничего не даст кроме ошибок.
У меня лично нулевой поток выполняет важную функцию. Обнули и все может сбится.минус метода, что обнулять переменную можешь не только ты)
Методов много, в том числе те, которые тут обсуждали. Какие-то проще, какие-то сложнее. Но пока зеннопостер не научится отдавать циферку активных потоков шаблона - всё костыли