Как запускать потоки поочереди? а не все сразу
-
Например если выбрали 30 потоков, можно как то сделать что бы все они запускались с задержкой в 20 секунд например, стартовал первый, ждем 20 секунд потом второй поток и т.п.
Подскажет кто как реализовать?
-
устанавливаешь в onApplicatonStart глобальную переменную в ноль. Далее каждый поток берет, и увеличивает ее на 20. После этого через действие Sleep устанавливаешь время равное глобальной переменной.
-
@lev said in Как запускать потоки поочереди? а не все сразу:
onApplicatonStart
Можно подробнее пожалуйста? как сделать что бы каждый поток увеличивал глобальную переменную на 20 секунд?
-
@35xakers Я думаю можно номер потока взять http://community.bablosoft.com/topic/197/вывести-в-переменную-номер-текущего-потока и потом допустим умножать номер потока на количество секунд, например 1 поток= 20на1, 2 поток=20на2 и т.д. и результат в ожидание кидать. Или можно например цикл сделать, ждать 20 секунд один раз если 1 поток, 2 раза если второй...
-
@35xakers Вот проект по мотивам ответа @Canine
0_1475668183691_startsequentially.xml
-
@support said in Как запускать потоки поочереди? а не все сразу:
@35xakers Вот проект по мотивам ответа @Canine
0_1475668183691_startsequentially.xmlуважаемый @support - может возможно все таки сделать такую настроку для многопотока - то есть добавить опцию - интервал между запусками потоков указать - и по умолчанию их сделать чтобы они с какой то задержкой запускались друг от друга, чтобы не жрали одинаковые ресурсы?
-
@Turutur Опишите пожалуйста точно как вы хотите, чтобы работало, желательно с примером. Возможно сделаю.
Да, и в новой версии есть ручное управление браузером, так что его можно создавать по желанию в определенное время в том числе и после задержки.
-
@support said in Как запускать потоки поочереди? а не все сразу:
Опишите пожалуйста точно как вы хотите, чтобы работало, желательно с примером.
Да тут в принципе и описывать нечего - просто по умолчанию сделайте паузу в запуске между потоками - минимально необходимую, чтобы BAS не использовал одни и те же данные - и возможно добавить настройку - поле ввода для это паузы
если без настройки - тогда какой то промежуток по умолчанию, чтобы не брались одни и те же строки из файла
-
@Turutur Я совсем запутался. БАС не использует одни и те же данные после перезапуска потока.
Я думал, что вам нужны паузы между в начале работы приложения. Если вы хотите чтобы делало паузы между запусками потока, то этого легко добиться поставив Спать последним действием.
-
@support said in Как запускать потоки поочереди? а не все сразу:
БАС не использует одни и те же данные после перезапуска потока
я не знаю по поводу перезапуска - но была ситуация, когда выставив 3 потока, где из списка брался первый элемент с удалением - все три потока использовали один и тот же элемент - затем он удалялся и все три потока использовали второй первый элемент...
@support said in Как запускать потоки поочереди? а не все сразу:
Если вы хотите чтобы делало паузы между запусками потока, то этого легко добиться поставив Спать последним действием.
Что то сдесь логика не прослеживается - спасть последним действием - это действие которое выполняется в конце потока - а при многопотоке потки идут паралельно?! - или нет? Если параллельно - то речь о том. чтобы сделать настройку для ступенчатого их запуска! друг за другом в заданном интервале
-
@Turutur Я сделал так.
В начале сделал сон от 1 минуты до 3 минут, в принципе все устраивает и получаются необходимые задержки)
-
я не знаю по поводу перезапуска - но была ситуация, когда выставив 3 потока, где из списка брался первый элемент с удалением - все три потока использовали один и тот же элемент - затем он удалялся и все три потока использовали второй первый элемент...
Да так и происходит. Когда вы загружаете ресурс в список то происходит копирование данных, и удаление данных из списка не влияет на ресурс. Это решается использованием ресурса {{res}}, а не таймаутами.
Что то сдесь логика не прослеживается - спасть последним действием - это действие которое выполняется в конце потока - а при многопотоке потки идут паралельно?! - или нет? Если параллельно - то речь о том. чтобы сделать настройку для ступенчатого их запуска! друг за другом в заданном интервале
Тогда предложенный вами вариант интерфейса будет смущать пользователей
-
@support said in Как запускать потоки поочереди? а не все сразу:
Это решается использованием ресурса {{res}}, а не таймаутами.
Что есть {{res}}? - я же не матерюсь - а Вы начинаете - я же помощи прошу - как мне при многопотоке брать первый элемент с удалением так, чтобы он был разный для всех потоков? Я так понимаю, что вариант предложенный @35xakers - то же не решит вопрос?
@support said in Как запускать потоки поочереди? а не все сразу:
Да так и происходит. Когда вы загружаете ресурс в список то происходит копирование данных, и удаление данных из списка не влияет на ресурс. Это решается использованием ресурса {{res}}, а не таймаутами.
Я пробовал загружать ресурс в список в онапликатионстарт - но переменные не работают - пробовал так же создать глобальную переменную в онапликатионстарт и присвоить ей значение переменной содержащей список - то же не але... Где вход, где выход???
-
@support said in Как запускать потоки поочереди? а не все сразу:
Когда вы загружаете ресурс в список то происходит копирование данных, и удаление данных из списка не влияет на ресурс.
А может копирование данных здесь не причем? - копирование данных из ресурса в буферный список - это само собой разумеющееся - но потоки использовали именно список а не ресурс - соответственно если копирование ресурса в список делать вне онапликатионстарт - то данное действие будет делать каждый поток - но переменная списка у нас одна - и если один из потоков уже взял данные со списка а второй их туда перенес с ресурса - то там снова появиться уже использованная строка, а если это сделать в онапликатионстарт - то действие выполниться один раз до запуска многопотока.
Скорее всего Вам это покажется бредом - я не настаиваю на правильности того что изложил - я просто показываю как это видел я, до того как Вы скинули пример - и если так думал я, человек без навыков кодирования - то так могут думать и другие простые пользователи. И мне до сих пор непонятно - почему не удалось сделать как делал я?
В онапликатионстарт делаем ресурс в список - присваиваем список в глобальную переменную и используем ее в основном проекте для всех потоков - то есть используем виртуальный список - берем с него первый элемент с удалением - (там даже галочка такая есть).... - - - Это я все веду к тому, что Вы ООООЧЕНЬ СЛОЖНО реализуете программу - каждый раз что-то пытаясь сделать - я начинаю чувствовать себя обезьяной с гранатой или дауном - хотя судя по тому, что я администрирую сайты и вношу изменения в штмл и цсс, причем удачно - таким не являюсь, хотя кто знает))).
Вот простой пример - использования авторизации по печенькам - да у меня чуть материнка в голове не пригорела - я как простой пользователь это вижу так:
загрузил сайт - ввел логин и пароль - авторизовался - записал кукисы в файл - это все понятно - далее авторизация по кукисам - 1е действие - загрузил кукисы - 2ое действие загрузил сайт - ВСЕ!!! - Кукисы уже были загружены в браузер - авторизация прошла успешно - Можно ли так сделать? - Это просто и логично в моем понимании) ВЕДЬ ИСПОЛЬЗОВАНИЕ ПРОКСИ РЕАЛИЗОВАНО ИМЕННО ТАК!!! СДЕЛАЙТЕ ТАК ЖЕ С КУКИСАМИ!!!!
-
Что есть {{res}}? - я же не матерюсь - а Вы начинаете - я же помощи прошу - как мне при многопотоке брать первый элемент с удалением так, чтобы он был разный для всех потоков? Я так понимаю, что вариант предложенный @35xakers - то же не решит вопрос?
Это элементарная задача - решается с помощью использования ресурсов. Когда используете ресурс, то БАС сам следит за тем чтобы он был разным для всех потоков. Что может быть проще?
Я пробовал загружать ресурс в список в онапликатионстарт - но переменные не работают - пробовал так же создать глобальную переменную в онапликатионстарт и присвоить ей значение переменной содержащей список - то же не але... Где вход, где выход???
Зачем пытаться сделать сложно, там где можно сделать легко?
А может копирование данных здесь не причем? - копирование данных из ресурса в буферный список - это само собой разумеющееся - но потоки использовали именно список а не ресурс - соответственно если копирование ресурса в список делать вне онапликатионстарт - то данное действие будет делать каждый поток - но переменная списка у нас одна - и если один из потоков уже взял данные со списка а второй их туда перенес с ресурса - то там снова появиться уже использованная строка, а если это сделать в онапликатионстарт - то действие выполниться один раз до запуска многопотока.
Какую цель вы ставите перед собой делая эти действия?
Скорее всего Вам это покажется бредом - я не настаиваю на правильности того что изложил - я просто показываю как это видел я, до того как Вы скинули пример - и если так думал я, человек без навыков кодирования - то так могут думать и другие простые пользователи. И мне до сих пор непонятно - почему не удалось сделать как делал я?
Потому что когда вы загружаете список в ресурс, то это просто копия ресурса и там могут быть ресурсы, которые другой поток использует сейчас.
В онапликатионстарт делаем ресурс в список - присваиваем список в глобальную переменную и используем ее в основном проекте для всех потоков - то есть используем виртуальный список - берем с него первый элемент с удалением - (там даже галочка такая есть).... - - - Это я все веду к тому, что Вы ООООЧЕНЬ СЛОЖНО реализуете программу - каждый раз что-то пытаясь сделать - я начинаю чувствовать себя обезьяной с гранатой или дауном - хотя судя по тому, что я администрирую сайты и вношу изменения в штмл и цсс, причем удачно - таким не являюсь, хотя кто знает))).
Это сделано для того, чтобы удалять дубликаты. Можно сделать проще - дописывать данные в файл сразу. Небольшой костыль пока не OnApplicationEnd
Вот простой пример - использования авторизации по печенькам - да у меня чуть материнка в голове не пригорела - я как простой пользователь это вижу так:
загрузил сайт - ввел логин и пароль - авторизовался - записал кукисы в файл - это все понятно - далее авторизация по кукисам - 1е действие - загрузил кукисы - 2ое действие загрузил сайт - ВСЕ!!! - Кукисы уже были загружены в браузер - авторизация прошла успешно - Можно ли так сделать? - Это просто и логично в моем понимании) ВЕДЬ ИСПОЛЬЗОВАНИЕ ПРОКСИ РЕАЛИЗОВАНО ИМЕННО ТАК!!! СДЕЛАЙТЕ ТАК ЖЕ С КУКИСАМИ!!!!Так и есть, но в том примере, что я сбрасывал поверх этого сделано несколько улучшений.
1). Проверка того, существует ли файл с куками.
2). Разные файлы для разных пользователей.
3). Проверка того, был ли выполнен вход.
4). Если сессия устарели вход все равно может быть выполнен с помощью логина и пароля.
5). Поддержка логинов, которые могут содержать символы запрещенныеЕсли начнете с тех 2 действий, которые описали, а потом будете добавлять фичи по одной, получится такая функция, как в примере.
-
@support Огромное человеческое спасибо! Это великий труд с Вашей стороны!
Неправильный ход моей мысли при использовании BAS - это моя проблема - просто реально прилагая усилия - хочется научиться понимать алгоритмы использования действий - примеров маловато(. Спасибо еще раз...
-
Подскажите как модифицировать предложенное решение, чтобы потоки не по 1-му стартовали по очереди, а партиями например по 20 штук(для примера число ядер процессора). Т.е. стартовали 20 потом через 30 секунд еще 20(к этому моменту 40 работают), потом еще через 30 секунд еще 20.
-
@Basak298 Самое простое, это в начале скрипта определять номер потока, а затем
if [[THREAD_INDEX]] > 20 && [[THREAD_INDEX]] < 40 sleep 30000 if [[THREAD_INDEX]] > 40 && [[THREAD_INDEX]] < 60 sleep 60000 if [[THREAD_INDEX]] > 60 && [[THREAD_INDEX]] < 80 sleep 90000 if [[THREAD_INDEX]] > 80 && [[THREAD_INDEX]] < 100 sleep 120000
-
@Fox определил номер потока и вставил Ваш код вначале(еще поправив синтаксис). Сейчас BAS тупо виснет при старте. Не пойму в чем причина. Если не сложно можете кусок простого проекта с такой реализацией скинуть?
-
Может кто-то привести пример с куском кода по моему вопросу? У меня BAS виснет и приложение BAS завершает работу.