Выполнение действия при любом результате завершения потока



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

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

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

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

    Можеть быть есть какое действие типа OnThreadEnd куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?



  • @gomeapat Поместить весь скрипт в "Игнорировать ошибки" а в if [[was_error]] прописать код для смены статуса аккаунта.



  • Хотя можно просто не помещать часть кода, отвещающего за смену статуса в "Игнорировать ошибки", а разместить чуть ниже



  • Да я понял что можно засунуть все в "Игнорировать ошибки"
    Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
    как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?



  • @gomeapat said in Выполнение действия при любом результате завершения потока:

    Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
    как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?

    Выполнится вложенное условие "Игнорировать ошибки", а игнор ошибок для всего скрипта не сработает

    Демо



  • Нашел решение не совсем конечно то что мне нужно было но хоть что то.
    Вообщем опишу может кому пригодится

    В действие OnApplicationStart
    создаем глобальную переменую массив в nodejs

    global.threads = new Array();
    

    И далее в каждом потоке

    //меняем статус у тех аккаунтов которые работали ранее 
    //и могли быть не правильно остановлены
    let thread_index = [[THREAD_INDEX]];
    if(global.threads[thread_index]){
        let old_account_id = global.threads[thread_index];
        query = "UPDATE account SET status='stop' WHERE id = ?";
        await global.adbtc.execute(query, [old_account_id])
            .then(result =>{
                result[0];
            })
            .catch(function(err) {
                console.log(err.message);
            }
        );
    }
    global.threads[thread_index] = [[ACCOUNT_ID]];
    

    Суть этого всего такая
    В глобальный массив threads сохраняется номер ACCOUNT_ID который сейчас в работе, а потом при его следующем старте в базе меняем его статус на stop
    В принципе все работает.
    Но если я жму оставить то следующий поток не запускается и мне все равно приходится после каждой остановки в базе делать руками

    UPDATE `account` SET `status`= 'stop'
    

    Но ни чего лучше я пока не придумал.



  • @gomeapat said in Выполнение действия при любом результате завершения потока:

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

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

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

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

    Можеть быть есть какое действие типа OnThreadEnd куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?

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


  • Banned

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



  • @gomeapat said in Выполнение действия при любом результате завершения потока:

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

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

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

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

    Можеть быть есть какое действие типа OnThreadEnd куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?

    Тема интересна и актуальна.
    У меня например строки с резервирования в базе не снимаются.
    Понятно что потом , когда то, анализируя лог постепенно минимизируешь такие ситуации когда скрипт не_доходит до конца (а именно в конце строка снимается с резерва).

    ТС, нашли решение?



  • @kuzkuz said in Выполнение действия при любом результате завершения потока:

    @gomeapat said in Выполнение действия при любом результате завершения потока:

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

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

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

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

    Можеть быть есть какое действие типа OnThreadEnd куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?

    Тема интересна и актуальна.
    У меня например строки с резервирования в базе не снимаются.
    Понятно что потом , когда то, анализируя лог постепенно минимизируешь такие ситуации когда скрипт не_доходит до конца (а именно в конце строка снимается с резерва).

    ТС, нашли решение?

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



  • @Fox

    положите все необходимые действия в функцию

    в смысле весь скрипт?



  • @kuzkuz said in Выполнение действия при любом результате завершения потока:

    @Fox

    положите все необходимые действия в функцию

    в смысле весь скрипт?

    Да. Берёте из функции Main вырезаете все действия и вставляете их в созданной функции



  • @Fox said in Выполнение действия при любом результате завершения потока:

    @kuzkuz said in Выполнение действия при любом результате завершения потока:

    @Fox

    положите все необходимые действия в функцию

    в смысле весь скрипт?

    Да. Берёте из функции Main вырезаете все действия и вставляете их в созданной функции

    Если я верно понял тут
    @GameBot said in Выполнение действия при любом результате завершения потока:

    @gomeapat said in Выполнение действия при любом результате завершения потока:

    Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
    как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?

    Выполнится вложенное условие "Игнорировать ошибки", а игнор ошибок для всего скрипта не сработает

    Демо

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



  • @kuzkuz said in Выполнение действия при любом результате завершения потока:

    @Fox said in Выполнение действия при любом результате завершения потока:

    @kuzkuz said in Выполнение действия при любом результате завершения потока:

    @Fox

    положите все необходимые действия в функцию

    в смысле весь скрипт?

    Да. Берёте из функции Main вырезаете все действия и вставляете их в созданной функции

    Если я верно понял тут
    @GameBot said in Выполнение действия при любом результате завершения потока:

    @gomeapat said in Выполнение действия при любом результате завершения потока:

    Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
    как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?

    Выполнится вложенное условие "Игнорировать ошибки", а игнор ошибок для всего скрипта не сработает

    Демо

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

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

    Тестовый скрипт



  • кстати да, вы правы. почему я читаю и верю не проверив в то что написано (
    спасибо


Log in to reply