Благодарю
Корректная остановка BAS
-
Привет всем!
- Как сделать плавную остановку BAS. Это второй режим остановки т.е. плавное завершение потоков. В доке написано что "в этом случае БАС будет ждать пока все потоки закончат свою работу". У меня ничего не происходит потоки по прежнему берут новые данные из ресурса для обработки. Может есть какая-то системная переменная. Если да то можно через if оценить что нажата плавная отмена и завершить поток довыполнив операции?
- Как можно задать количество потоков через ресурс а не в редакторе БАС?
СПС
-
@super84, @dilolo Спасибо... Все очевидно. Жаль что сам не догадался ))
@dilolo Когда останавливаешь скрипт принудительно. Мне необходимо что все что он делает доделал. А потом стоп.
Если кратко я в цикле беру из файлового ресурса линки и обрабатываю их разными потоками. Когда я нажимаю на мягкий останов они не останавливаются.
https://i.imgur.com/ywWMXbl.png -

Вот условный пример допустим поток что то делает и в цикле. В результате своей работы он должен сохранить что-то в файл. В процессе работы пользователь нажимает на Остановить->ждать каждый поток
Каким образом поток узнает о этом действии пользователя? -
Когда я нажимаю на мягкий останов они не останавливаются.
просто новые потоки не будут запущенны, когда настоящие вылетят по успеху или ошибке
пока цикл выполняется БАС никуда палки в колеcа ставить не будет.сами можете в файл stop.txt записать цифру 1, и это и будет тем условием, чтобы после сохранения ddd.txt завершить поток без перезапуска, ну или сон.
-
@oleg4ever Спасибо за ответ!!! Поведение баса понятно но не логично... Что я имею виду. Я понимаю так что если я нажал кнопку мягкого останова то должна установиться какая-то системная переменная например в true. И тогда я программа корректно остановиться.
Решение с файлом рабочее но это к сожалению костыль. Может у кого то есть исходники баса и можете посмотреть не устанавливает он какую либо переменную. (может через JS и тд).
Прога отличная но как-то тут разрабы упустили... -
@tanamir
что тут не логичного? Суть остановки и есть в том, что бы дать потоку завершить свою работу.
Как по вашему он должен понимать, что вам бы хотелось, что бы он закончил работу именно в "этом" месте и именно на 105 повторе цикла... Надо правильно логику продумывать, а не искать "подпорки" -
@UserTrue Не хочу разводить дискуссию но когда необходимо обработать большой массив данных на несколько десятки часов то нормальный мягкий останов был бы не лишним. Разные случаи бывают. И просто выставить переменную (семафор) и дать программе корректно остановиться (если она использует логику цикла) это абсолютно нормально...
-
Всем привет, реанимирую топик )
@tanamir said in Корректная остановка BAS:
нажимает на Остановить->ждать каждый поток
Каким образом поток узнает о этом действии пользователя?Вот надо же, только собрался писать свой первый суперсерьезный скрипт на БАСе, и уперся в эту же проблему... (
Захотел сделать так, чтобы из первого потока, в функции Main, цикл while(true) - запускал асинхронные функции с разными задачами. Цикл с задержкой, ну пусть с 1000 мс. сна, для примера. Ведь у асинхронных функций с задачами - время работы все равно намного дольше, это как правило. Для начала нужно, чтобы в цикле, каждую ~1 секунду проверялись результаты работы асинхронных функций, завершена ли задача, или ещё выполняется. Количество одновременно запущенных функций - регулировать динамически, из основного цикла, опираясь на указанное в ресурсах максимальное количество одновременно работающих потоков, отдельно для каждой задачи, и в зависимости от объема задач. Объем задач может меняться динамически, во время работы скрипта.Останавливаю скрипт, выбирая: "ждать каждый поток" - а цикл как работал, так и работает. Как запускал новые функции асинхронно в других потоках - так и запускает, и останавливаться не хочет ))
Только останавливать принудительно. А это - чревато потерей данных и потенциальной потерей расходников, потому-что хз на каком этапе завершились потоки при принудительной остановке скрипта. Мне что, в файл писать каждое действие, чтобы потом при перезапуске скрипта - возобновлять работу функций с какого-то места? Скорее всего - начало основных действий писать в файл/базу придется, для продолжения работы после сбоя софта или перезагрузки машины. Но пока как-то не приоритет, да и сложновато на начальных этапах. Походу это замедлит скрипт, смотря какие действия сохранять, и с какой частотой. Хочется, конечно, максимальной отказоустойчивости, но не всё же сразу )))
Я конечно понимаю, что моя логика, возможно, немного расходится со стандартными подходами скриптописания на BAS, но разве я не могу в функциях, запущенных асинхронно, работать с разными профилями браузера - создавать новые, загружать уже сохраненные, вызывать другие функции с проверками и обработчиками для этого потока синхронно (или асинхронно, если надо), и уже чтобы потом, после получения нужного результата, эта асинхрорнная функция спокойно завершалась, сохраняя все нужные данные?
Просто захотелось навелосипедить для начала гулялку, чтобы была своя - самописная, для создания и прогрева профилей браузера с разными отпечатками(скоро приду за ключом для FS) и на разных проксях, и последующей работы из этих профилей с гуглом (ютубом).
Товарищи, за эти полгода ничего не поменялось? Неужели до сих пор нечего засунуть вместо true во while? Хотя судя по моей логике - мне только через break выходить, когда завершатся уже начатые задачи.
Неужели никак не узнать, что пользователь ожидает завершения скрипта, и что уже пора перестать запускать новые задачи из цикла, и завершить этот цикл?
Весь форум перекопал, не могу найти решение (@UserTrue said in Корректная остановка BAS:
Как по вашему он должен понимать, что вам бы хотелось, что бы он закончил работу именно в "этом" месте и именно на 105 повторе цикла...
Получен сигнал завершения скрипта(узнали об этом при очередной итерации основного цикла скрипта в первом потоке) > Больше не запускаем новые задачи > Корректно завершили все начатые задачи > Вызвали Break - вышли из основного цикла > Успешное завершение скрипта
@tanamir said in Корректная остановка BAS:
Я понимаю так что если я нажал кнопку мягкого останова то должна установиться какая-то системная переменная например в true
Именно так я это и представляю )
Подскажите, пожалуйста - как быть. Рад любому совету, решению, ну или критике -
-
@tet-vivi, за эту секунду, может завершиться одна из десятка мелких асинхронных задач, и её нужно будет либо побыстрее перезапускать с другими параметрами, либо побыстрее запускать другую функцию асинхронно.
Да, наверное, 1 секунды для главного цикла - слишком мало, соглашусь, но это пока для тестов.
Потом этот параметр тоже выведу в ресурс, чтобы можно было менять при запуске скрипта -
@Dizelyator асинхронные функции в бас вроде как поддерживают очередь.
то есть можно стразу отправить все задачи туда, а бас как появится свободный поток его сразу запустит. -
Подниму тоже топик. Полностью согласен с Dizelyator и удивлен полному игнору со стороны разработчика и поддержки.
К примеру требуется регулировать количество запущенных потоков динамически, либо циклически вызывать какие то действия. Для этого можно использовать запуск асинхронных функций. Но отследить то, что пользователь нажал завершить скрипт через ожидание выполнения потоков, в данный момент невозможно.
Для чего это нужно? Для того, чтобы завершить поток, который вызывает эти самые асинхронные функции. Все бы ничего, если бы бы выбор "ждать каждый поток" мог хотя бы не запускать в работу асинхронные функции, которые стоят в очереди. Тогда это решило бы проблему. Либо дать доступ к событию выбора остановить скрипт через "ждать каждый поток"
PS Есть еще один вариант. Запускать скрипт в 1 поток бесконечно. Да, такой вариант, вполне годен, но есть одно НО. Такой поток будет, простите за выражение, постоянно срать в лог и в отчет своим "поток завершился ОК"
-
@Ajshma said in Корректная остановка BAS:
Но отследить то, что пользователь нажал завершить скрипт через ожидание выполнения потоков, в данный момент невозможно.
Не совсем так, все возможно.
Например, можно иметь кастомный интерфейс к программе. И собственные кнопки завершения, по нажатии на которые можно сделать любую логику в программе.
-
Вы бы подробнее описали свой кейс - для чего вы используете асинхронный вызов. Я понимаю, что вы наверняка больше меня знаете (ну или так думаете). Но вызов асинхронных функций, это черный ящик по большому счету, и если можно задачу решать обычными потоками, то лучше на мой субъективный взгляд, решать ее через обычные потоки. А управлять динамичностью потоков можно через ресурс из файла например.
-
@Ajshma said in Корректная остановка BAS:
К примеру требуется регулировать количество запущенных потоков динамически, либо циклически вызывать какие то действия.
-
@mister40mrdoors said in Корректная остановка BAS:
Вы бы подробнее описали свой кейс - для чего вы используете асинхронный вызов.
Я подробно достаточно описал то, что требуется. Если Вам непонятно, увы...
Я понимаю, что вы наверняка больше меня знаете (ну или так думаете). Но вызов асинхронных функций, это черный ящик по большому счету, и если можно задачу решать обычными потоками, то лучше на мой субъективный взгляд, решать ее через обычные потоки.
Если по существу проблемы ответить нечего, то оставьте свое субъективное мнение при себе. Просто на просто оно не несет никакой смысловой нагрузки.
А управлять динамичностью потоков можно через ресурс из файла например.
Повторяю, Ваше мнение - не несет никакой смысловой нагрузки. Как реализовать динамическое управление потоками я могу перечислить с десяток вариантов, и лучшее решение сейчас уже реализовано у меня. Проблема, если не доходит, лично до Вас - завершить скрипт через выбор "ждать каждый поток". Вот если у вас будет решение - с удовольствием выслушаю.
@Fox said in Корректная остановка BAS:
Нет проблемы управлять количеством потоков динамически. Есть проблема в том, что выбор остановки скрипта через "ждать каждый поток" - не завершает сам скрипт из-за того, что управляющий поток не может быть остановлен.
Требуется или событие, которое сообщает, что БАС ожидает остановку потоков, или не запускать асинхронные функции, стоящие в очереди, в работу.
-
@sergerdn said in Корректная остановка BAS:
Не совсем так, все возможно.
Конечно возможно. И даже один вариант я описал, но это все костыли.
Например, можно иметь кастомный интерфейс к программе. И собственные кнопки завершения, по нажатии на которые можно сделать любую логику в программе.
И это костыль. Мы же просим нормальное, логичное решение со стороны БАСа.
-
@Ajshma Слушай, нос задрал и ладно, я тут дольше тебя на этом форуме и по совокупности если взять все мои тут аки - и по репутации. Письками, меряться не буду.
А по теме - если не использовать матрешку - параллельные потоки в параллельных потоках - то все прекрасно завершается.
Лень кейс описывать - твои проблемы.



