Thread ended with message "All data have been processed for ..."

Поддержка
  • Вероятно, я не до конца понимаю, как работают ресурсы.

    Исходные данные:

    • файл в виде ресурса LinesFromFile
    • кол-во потоков

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

    Я же получаю, что после того, как для потоков не остается данных, потоки стартуют и заканчивают работу с ошибкой, что нет для них данных. Заканчивают потоки с ошибкой еще до выполнения кода скрипта. Вероятно, BAS проверяет ресурс на наличие данных в нем после старта потока и до начала выполнения кода в нем.

    Не понимаю, как организовать логику таким образом, чтобы если в ресурсе не осталось данных, то поток не стартовал бы или "красиво" завершался без ошибки вида "Ended with message: All data have been processed for KeywordsFile".

    Скрипт и данные для него прикладываю.
    bug_report_1.zip

    Скриншоты:

    UPDATE:
    Решение ТУТ

    Другой путь ТУТ

  • Проверять кол-во элементов в ресурсе, при 0 завершать поток

  • @gaget007 said in Thread ended with message "All data have been processed for ...":

    Проверять кол-во элементов в ресурсе, при 0 завершать поток

    У него на скриншоте такая логика и изображена

  • @gaget007 said in Thread ended with message "All data have been processed for ...":

    Проверять кол-во элементов в ресурсе, при 0 завершать поток

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

    Также написал, что BAS проверяет наличие данных в ресурсе до исполнения кода скрипта, чтобы я там не делал, до моего кода не доходит.

  • @Fox said in Thread ended with message "All data have been processed for ...":

    @gaget007 said in Thread ended with message "All data have been processed for ...":

    Проверять кол-во элементов в ресурсе, при 0 завершать поток

    У него на скриншоте такая логика и изображена

    Единственное, что приходит в голову, это:

    • запускать скрипт в одном потоке
    • вручную управлять логикой, исполняя основной код с помощью Call function asynchronously
    • также вручную управлять запуском новых потоков
    • вручную отслеживать статус их выполнения с помощью Get async function result
    • etc

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

    Вообщем не тривиально.

  • Пока не найдено "красивое" решение, я внедрил обходной путь.

    • Запускаю скрипт в одном потоке
    • Отказался от использования в коде основной логики обращение к ресурсу за данными.
    • Запускаю код логики в асинхронной функции с параметром, а не получаю данные из ресурса. Параметр получаю в основном потоке, преобразовав все данные из ресурса в LIST и итерируюсь по ним в цикле.
    • В основном потоке в конце логики дожидаюсь пока все асинхронные функции завершат свою работу

    Мне пришлось в коде основной логики все равно обращаться к ресурсу, чтобы считалась правильно статистика Resource Report.

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

    Теперь все красиво:
    Capture.PNG

    Данные прикладываю:
    bug_report_fix_1.zip

  • Run Type - Repeat. Может по этому скрипт перезапускается?

  • @gaget007 said in Thread ended with message "All data have been processed for ...":

    Run Type - Repeat. Может по этому скрипт перезапускается?

    Скрипт не перезапускается.
    Задача как раз стоит запускать новые потоки, пока есть доступные данные в ресурсе:
    Script will be constantly repeated infinitely or until data for any resource will be exhausted, or until "End Script" will be executed.

    Проблема в том, что BAS сначала запускает поток, потом проверяет есть ли ресурсы и далее передает управление моему коду.
    Если ресурсов нет, то завершает поток с ошибкой до передачи управления моему коду.

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

  • Не могу понять пока в чем проблема, было лень скачивать и набросал всё то же, и у меня результат такой

    image.png

    image.png

    По опыту эта проверка всегда в момент обращения к ресурсу, тоесть там может быть 5 минут работы потока и когда он обратится к ресурсу - только тогда будет прерван скрипт.
    Сейчас скачаю скрипт что бы попробовать понять что не так

  • @DrPrime said in Thread ended with message "All data have been processed for ...":

    По опыту эта проверка всегда в момент обращения к ресурсу, тоесть там может быть 5 минут работы потока и когда он обратится к ресурсу - только тогда будет прерван скрипт.

    Нет, я написал скрипт, который демонстрирует, что BAS проверяет есть ли в ресурсе данные ДО запуска самого кода в потоке, то есть ДО обращения к ресурсу, который пустой.

    @DrPrime said in Thread ended with message "All data have been processed for ...":

    Сейчас скачаю скрипт что бы попробовать понять что не так

    Проблема с каким сообщением скрипт закончил работу, у тебя он так же, как и у меня закончил с ошибкой.

  • image.png

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

  • @DrPrime said in Thread ended with message "All data have been processed for ...":

    image.png

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

    Предположение о проверке до запуска потока развенчано

    Ок, не вопрос, предположу, что ты прав и BAS работает не так, как я написал выше.

    Как избежать такого? Цель поста НЕ выяснить почему BAS так себя ведет, а выяснить как сделать так, чтобы скрипт не завершался с ошибкой.

  • как вариант onlyfail для ресурса и игнор ошибок

  • можно так же вручную удалять ресурсы что бы быстрее обновлялась инфа о свободных ресурсах

  • @DrPrime said in Thread ended with message "All data have been processed for ...":

    можно так же вручную удалять ресурсы что бы быстрее обновлялась инфа о свободных ресурсах

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

  • Удаляй без галочки, он просто удалит его из системы ресурсов

  • @DrPrime said in Thread ended with message "All data have been processed for ...":

    Удаляй без галочки, он просто удалит его из системы ресурсов

    Спасибо большое, я решил свою проблему.

    Изначально у меня была проблема в том, что когда я смотрел на логи, несмотря на то, что в логах был номер кубика, я прошляпил этот момент и строил гипотезы, которые ни на чем не основаны.

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

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

    Capture.PNG
    Capture_1.PNG

    P.S.
    Глобальный вывод из этого топика, что я сделал - надо отдыхать.

  • @sergerdn said in Thread ended with message "All data have been processed for ...":

    Задача как раз стоит запускать новые потоки, пока есть доступные данные в ресурсе:

    Я наподобие такого делал так. Создал асинхронную функцию с лимитом в 1 поток, которая в бесконечном цикле запускала импорт аккаунтов в базу.

    Режим запуска - "Повторять".

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

  • @thepappo said in Thread ended with message "All data have been processed for ...":

    @sergerdn said in Thread ended with message "All data have been processed for ...":

    Задача как раз стоит запускать новые потоки, пока есть доступные данные в ресурсе:

    Я наподобие такого делал так. Создал асинхронную функцию с лимитом в 1 поток, которая в бесконечном цикле запускала импорт аккаунтов в базу.

    Режим запуска - "Повторять".

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

    Спасибо, что поделился.
    У меня основная проблема была - "я смотрел в книгу, а видел фигу"

    @sergerdn said in Thread ended with message "All data have been processed for ...":

    Изначально у меня была проблема в том, что когда я смотрел на логи, несмотря на то, что в логах был номер кубика, я прошляпил этот момент

  • 0 Votes
    2 Posts
    306 Views
  • 0 Votes
    3 Posts
    590 Views
  • 0 Votes
    3 Posts
    1082 Views
  • 0 Votes
    2 Posts
    1236 Views
  • 0 Votes
    14 Posts
    3896 Views