Зависание при работе нескольких потоков над разными заданиями



  • Структура шаблона такая (без OnApplicationStart):

    Получить номер потока
    Если номер потока = 1 
           Функция 1
           Пока правда
                  Функция 2
                  Функция 3
    Если номер потока  > 1
           Функция 4
           Пока правда
                  Функция 5
    

    При такой структуре БАС проделывает Функции 1,2,3 и зависает вместо того, чтобы вернуться в начало вечного цикла для потока.

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

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

    P.S Когда выполняется один поток, он не повторяет нужные функции в вечном цикле вечно, а завершается после какого-то количества повторов, постоянно разного. Это тоже странно и крайне нежелательно, так как шаблон должен работать в мое отсутствие.



  • @MAKAR Не совсем понятно что делают функции 2 и 3. Если может случится так, что они выполняются мгновенно, то скрипт попадет в бесконечный цикл и зависнет. Я всегда использую сон на 1 секунду перед началом нового цикла. Если функции будут ждать ресурс или ввода капчи, они тоже могут зависнуть, в остальных случаях БАС должен завершать поток по таймауту, если действие длится слишком долго.

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

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

    Ну и можно добавить логирование и смотреть в каком месте зависает.

    Получить номер потока
    Если номер потока = 1 
           Функция 1
           Пока правда
                  лог ф2+
                  Функция 2
                  лог ф2-
                  лог ф3+
                  Функция 3
                  лог ф3+
    Если номер потока  > 1
           Функция 4
           Пока правда
                  лог ф5+
                  Функция 5
                  лог ф5-
    ``


  • Спасибо, все как всегда просто. Увеличил все паузы до 2 секунд, и работает нормально. А вчера сидел отлаживал 4 часа)


Log in to reply