Корректная остановка BAS

Поддержка
  • @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

    Именно так я это и представляю )
    Подскажите, пожалуйста - как быть. Рад любому совету, решению, ну или критике

  • @Dizelyator said in Корректная остановка BAS:

    каждую ~1 секунду проверялись

    зачем так часто?

  • @tet-vivi, за эту секунду, может завершиться одна из десятка мелких асинхронных задач, и её нужно будет либо побыстрее перезапускать с другими параметрами, либо побыстрее запускать другую функцию асинхронно.
    Да, наверное, 1 секунды для главного цикла - слишком мало, соглашусь, но это пока для тестов.
    Потом этот параметр тоже выведу в ресурс, чтобы можно было менять при запуске скрипта

  • @Dizelyator асинхронные функции в бас вроде как поддерживают очередь.
    то есть можно стразу отправить все задачи туда, а бас как появится свободный поток его сразу запустит.

  • Подниму тоже топик. Полностью согласен с Dizelyator и удивлен полному игнору со стороны разработчика и поддержки.

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

    Для чего это нужно? Для того, чтобы завершить поток, который вызывает эти самые асинхронные функции. Все бы ничего, если бы бы выбор "ждать каждый поток" мог хотя бы не запускать в работу асинхронные функции, которые стоят в очереди. Тогда это решило бы проблему. Либо дать доступ к событию выбора остановить скрипт через "ждать каждый поток"

    PS Есть еще один вариант. Запускать скрипт в 1 поток бесконечно. Да, такой вариант, вполне годен, но есть одно НО. Такой поток будет, простите за выражение, постоянно срать в лог и в отчет своим "поток завершился ОК"

  • @Ajshma said in Корректная остановка BAS:

    Но отследить то, что пользователь нажал завершить скрипт через ожидание выполнения потоков, в данный момент невозможно.

    Не совсем так, все возможно.

    Например, можно иметь кастомный интерфейс к программе. И собственные кнопки завершения, по нажатии на которые можно сделать любую логику в программе.

  • Вы бы подробнее описали свой кейс - для чего вы используете асинхронный вызов. Я понимаю, что вы наверняка больше меня знаете (ну или так думаете). Но вызов асинхронных функций, это черный ящик по большому счету, и если можно задачу решать обычными потоками, то лучше на мой субъективный взгляд, решать ее через обычные потоки. А управлять динамичностью потоков можно через ресурс из файла например.

  • @Ajshma said in Корректная остановка BAS:

    К примеру требуется регулировать количество запущенных потоков динамически, либо циклически вызывать какие то действия.

    https://community.bablosoft.com/topic/3521/лайфхаки-bas/84

  • @mister40mrdoors said in Корректная остановка BAS:

    Вы бы подробнее описали свой кейс - для чего вы используете асинхронный вызов.

    Я подробно достаточно описал то, что требуется. Если Вам непонятно, увы...

    Я понимаю, что вы наверняка больше меня знаете (ну или так думаете). Но вызов асинхронных функций, это черный ящик по большому счету, и если можно задачу решать обычными потоками, то лучше на мой субъективный взгляд, решать ее через обычные потоки.

    Если по существу проблемы ответить нечего, то оставьте свое субъективное мнение при себе. Просто на просто оно не несет никакой смысловой нагрузки.

    А управлять динамичностью потоков можно через ресурс из файла например.

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

    @Fox said in Корректная остановка BAS:

    https://community.bablosoft.com/topic/3521/лайфхаки-bas/84

    Нет проблемы управлять количеством потоков динамически. Есть проблема в том, что выбор остановки скрипта через "ждать каждый поток" - не завершает сам скрипт из-за того, что управляющий поток не может быть остановлен.

    Требуется или событие, которое сообщает, что БАС ожидает остановку потоков, или не запускать асинхронные функции, стоящие в очереди, в работу.

  • @sergerdn

    @sergerdn said in Корректная остановка BAS:

    Не совсем так, все возможно.

    Конечно возможно. И даже один вариант я описал, но это все костыли.

    Например, можно иметь кастомный интерфейс к программе. И собственные кнопки завершения, по нажатии на которые можно сделать любую логику в программе.

    И это костыль. Мы же просим нормальное, логичное решение со стороны БАСа.

  • @Ajshma Слушай, нос задрал и ладно, я тут дольше тебя на этом форуме и по совокупности если взять все мои тут аки - и по репутации. Письками, меряться не буду.
    А по теме - если не использовать матрешку - параллельные потоки в параллельных потоках - то все прекрасно завершается.
    Лень кейс описывать - твои проблемы.

  • @mister40mrdoors и опять только воздух испортил. Очень напоминает на манеру дакдака...

  • @Ajshma Да да один из них - и то что тут немного наконфликтил - это это никак не отменяет опыта.

  • @Ajshma said in Корректная остановка BAS:

    @sergerdn

    @sergerdn said in Корректная остановка BAS:

    Не совсем так, все возможно.

    Конечно возможно. И даже один вариант я описал, но это все костыли.

    Например, можно иметь кастомный интерфейс к программе. И собственные кнопки завершения, по нажатии на которые можно сделать любую логику в программе.

    И это костыль. Мы же просим нормальное, логичное решение со стороны БАСа.

    Кастомный интерфейс совсем не костыль ни разу. А как раз стандартная возможность сделать все, что угодно разработчику.

    Другое дело, что требования к разработчику резко возрастают.

    Плюс еще нюансы, что документации толком нет, разные люди наступают на одни и те же грабли, набивают одни и те же шишки и делают это по тихому. Так что другим разработчикам опять приходится проходить тот же путь.

  • @mister40mrdoors said in Корректная остановка BAS:

    @Ajshma Да да один из них - и то что тут немного наконфликтил это это никак не отменяет опыта.

    Ну вот видишь, может пора меняться? Вроде как опыт есть (по твоему мнению), а кроме как пустословить - ничего предложит не можешь. Вот, давай, если ты такой опытный:
    Как завершить поток, который работает в цикле, через выбор остановить скрипт "ожидать каждый поток"?

  • @mister40mrdoors said in Корректная остановка BAS:

    @Ajshma Да да один из них - и то что тут немного наконфликтил это это никак не отменяет опыта.

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

  • @sergerdn said in Корректная остановка BAS:

    Другое дело, что требования к разработчику резко возрастают.

    И самое главное время разработки, я сам им лично почти не пользуюсь, хотя хорошо в нем разобрался и даже переписал api на более удобное. Но как показывает практика если не пишешь проект для массовых продаж, то этот интерфейс никому не нужен ) А для собственного использования у меня получается обходиться без него, может не так красиво, но личное время это тоже деньги.

  • @sergerdn Кастомный интерфейс костыль - потому, что у меня несколько сотен настроек в интерфейсе. И работа с интерфейсом продолжается уже третий год, каждый день изменяясь. Это я про то, что в принципе работа над скриптом идет очень плотно, и нет времени на постоянную доработку еще и вебинтерфейса. Мало того, если бы автоматическое портирование обычного интерфейса работало корректно - как то оптимизировать можно было. Но к примеру, даже стандартный модуль списка драг-энд-дропа портирование сделать не может, и нужно ручками корячить свои решения.

    А проблема решается всего то просто очисткой очереди ассинхронных функций, если пользователь решил остановить скрипт. Все. Проблемы нет.