@FastSpace said in Проблема при многопоточной работе с ресурсом:
@sayado колличество элементов в ресурсе. Меньше чем x, ждать пока появится больше
?? как мне "ждать пока появится больше"?
Нашел решение не совсем конечно то что мне нужно было но хоть что то.
Вообщем опишу может кому пригодится
В действие 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 куда я мог спокойно записать необходимые мне операции по завершению работы с потоками?
Вы можете использовать модуль "Асинхронный вызов функции", запускать в цикле необходимое количество потоков через действие "Вызов функции асинхронно" и проверять работу запущенных потоков через действие "Получить результат асинхронной функции". В этом действии можно узнать работает ли поток, если поток завершён, то завершился ли он успешно, или с ошибкой.
Вообще какая то бед практикс. Ну нельзя спотыкаясь и падая, чему то какой-то статус присваивать. Делайте обработку ошибок и на каждом шаге выход по ошибке, так вы по крайней мере сможете отладить приложение. А так как у вас - это получается - запустил хренатень > отработала не отработала, пофиг ....
@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 Выполнение действия при любом результате завершения потока:
Но внутри кода у меня там и так много где используется уже блок "Игнорировать ошибки"
как тогда будут обрабатываться ошибка до первого блока "Игнорировать ошибки"?Выполнится вложенное условие "Игнорировать ошибки", а игнор ошибок для всего скрипта не сработает
то не сработает при наличии вложенных игнорировать.. а они нужны, чтобы скрипт продолжал работу
Вы бы хоть что то проверяли, перед умозаключением. Вот я сейчас потратил меньше двух минут на тестовый скрипт и на нём сразу видно как и что будет и не будет выполняться
Тестовый скрипт