@basser всё, что ты не сможешь сделать в Google Chrome, не получится и в BAS. И ответов знающих придётся ждать вечно.
Выполнение действия при любом результате завершения потока
-
Вообщем у меня скипт крутится на сайте в много потоков,
для отслеживания того какой аккаунт у меня сейчас в работе используется база при старте потока, изменяется состояние аккаунта, допустим на значение "работа"
потом при завершение работы состояние аккаунта снова меняется на допустим на значение "стоп"Проблема в том что скрипт не всегда выполняется до конца, иногда бывают ошибки реально времени, что то где то не до грузилось, что то где то не появлось и вследствие не
корректно завершился поток, а с ошибкой.Так вот такие ошибки приводят к тому что состояние аккаунта не изменяется и он больше не участвует в работе, пока я сам руками в базе не изменю его статус.
Я знаю что есть действие "Игнорировать ошибки", но тогда если его использовать то мне тогда придется весь скрипт поместить в это действие так как ошибки реального времени могут случиться где угодно,
Можеть быть есть какое действие типа OnThreadEnd куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?
-
@gomeapat said in Выполнение действия при любом результате завершения потока:
Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?Выполнится вложенное условие "Игнорировать ошибки", а игнор ошибок для всего скрипта не сработает
-
Нашел решение не совсем конечно то что мне нужно было но хоть что то.
Вообщем опишу может кому пригодитсяВ действие OnApplicationStart
создаем глобальную переменую массив в nodejsglobal.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 куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?
Вы можете использовать модуль "Асинхронный вызов функции", запускать в цикле необходимое количество потоков через действие "Вызов функции асинхронно" и проверять работу запущенных потоков через действие "Получить результат асинхронной функции". В этом действии можно узнать работает ли поток, если поток завершён, то завершился ли он успешно, или с ошибкой.
-
Вообще какая то бед практикс. Ну нельзя спотыкаясь и падая, чему то какой-то статус присваивать. Делайте обработку ошибок и на каждом шаге выход по ошибке, так вы по крайней мере сможете отладить приложение. А так как у вас - это получается - запустил хренатень > отработала не отработала, пофиг ....
-
@gomeapat said in Выполнение действия при любом результате завершения потока:
Вообщем у меня скипт крутится на сайте в много потоков,
для отслеживания того какой аккаунт у меня сейчас в работе используется база при старте потока, изменяется состояние аккаунта, допустим на значение "работа"
потом при завершение работы состояние аккаунта снова меняется на допустим на значение "стоп"Проблема в том что скрипт не всегда выполняется до конца, иногда бывают ошибки реально времени, что то где то не до грузилось, что то где то не появлось и вследствие не
корректно завершился поток, а с ошибкой.Так вот такие ошибки приводят к тому что состояние аккаунта не изменяется и он больше не участвует в работе, пока я сам руками в базе не изменю его статус.
Я знаю что есть действие "Игнорировать ошибки", но тогда если его использовать то мне тогда придется весь скрипт поместить в это действие так как ошибки реального времени могут случиться где угодно,
Можеть быть есть какое действие типа OnThreadEnd куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?
Тема интересна и актуальна.
У меня например строки с резервирования в базе не снимаются.
Понятно что потом , когда то, анализируя лог постепенно минимизируешь такие ситуации когда скрипт не_доходит до конца (а именно в конце строка снимается с резерва).ТС, нашли решение?
-
@kuzkuz said in Выполнение действия при любом результате завершения потока:
@gomeapat said in Выполнение действия при любом результате завершения потока:
Вообщем у меня скипт крутится на сайте в много потоков,
для отслеживания того какой аккаунт у меня сейчас в работе используется база при старте потока, изменяется состояние аккаунта, допустим на значение "работа"
потом при завершение работы состояние аккаунта снова меняется на допустим на значение "стоп"Проблема в том что скрипт не всегда выполняется до конца, иногда бывают ошибки реально времени, что то где то не до грузилось, что то где то не появлось и вследствие не
корректно завершился поток, а с ошибкой.Так вот такие ошибки приводят к тому что состояние аккаунта не изменяется и он больше не участвует в работе, пока я сам руками в базе не изменю его статус.
Я знаю что есть действие "Игнорировать ошибки", но тогда если его использовать то мне тогда придется весь скрипт поместить в это действие так как ошибки реального времени могут случиться где угодно,
Можеть быть есть какое действие типа OnThreadEnd куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?
Тема интересна и актуальна.
У меня например строки с резервирования в базе не снимаются.
Понятно что потом , когда то, анализируя лог постепенно минимизируешь такие ситуации когда скрипт не_доходит до конца (а именно в конце строка снимается с резерва).ТС, нашли решение?
положите все необходимые действия в функцию и её вызов оберните в игнор ошибок. После вызова поставьте условие на was_error, если true, значит функция завершилась ошибкой и выполняйте необходимые действия
-
@kuzkuz said in Выполнение действия при любом результате завершения потока:
положите все необходимые действия в функцию
в смысле весь скрипт?
Да. Берёте из функции Main вырезаете все действия и вставляете их в созданной функции
-
@Fox said in Выполнение действия при любом результате завершения потока:
@kuzkuz said in Выполнение действия при любом результате завершения потока:
положите все необходимые действия в функцию
в смысле весь скрипт?
Да. Берёте из функции Main вырезаете все действия и вставляете их в созданной функции
Если я верно понял тут
@GameBot said in Выполнение действия при любом результате завершения потока:@gomeapat said in Выполнение действия при любом результате завершения потока:
Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?Выполнится вложенное условие "Игнорировать ошибки", а игнор ошибок для всего скрипта не сработает
то не сработает при наличии вложенных игнорировать.. а они нужны, чтобы скрипт продолжал работу
-
@kuzkuz said in Выполнение действия при любом результате завершения потока:
@Fox said in Выполнение действия при любом результате завершения потока:
@kuzkuz said in Выполнение действия при любом результате завершения потока:
положите все необходимые действия в функцию
в смысле весь скрипт?
Да. Берёте из функции Main вырезаете все действия и вставляете их в созданной функции
Если я верно понял тут
@GameBot said in Выполнение действия при любом результате завершения потока:@gomeapat said in Выполнение действия при любом результате завершения потока:
Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?Выполнится вложенное условие "Игнорировать ошибки", а игнор ошибок для всего скрипта не сработает
то не сработает при наличии вложенных игнорировать.. а они нужны, чтобы скрипт продолжал работу
Вы бы хоть что то проверяли, перед умозаключением. Вот я сейчас потратил меньше двух минут на тестовый скрипт и на нём сразу видно как и что будет и не будет выполняться
Тестовый скрипт