@GhostZ а ок, да он пойдет. Тогда спасибо всё работает
Помогите с логикой
-
В проекте "глабальный" цикл в 1 поток.
Он берёт новость, подготавливает её и запускает функцию в 10 потоков.
После чего увеличивает счётчик и берёт следующую новость.Функция же, запускаемая в 10 потоков, представляет из себя цикл отправки новости на сайты.
В конце функции на всякий случай запихан Succes.В общем нужно, чтобы каждый поток отработал один раз эту функцию и "прекратился" (не запускался больше поток). При этом, чтобы продолжился (не прервался) "глобальный" цикл.
Подскажите пожалуйста как правильно выставить "Успешные - Неуспешные" настройки для функции (1 или 10?)...
Второй вопрос: не прервёт ли действие Succes "глобальный" цикл?
Третий вопрос: Не перезапустит ли Succes поток, так как нет опции как в Fail "не перезапускать поток"?
-
@LCFSCS
Логика:- В основном потоке можно поставить цикл FOR от 1 до 10.
- В цикл засунуть нужную асинхронную функцию (действие "Вызвать функцию асинхронно").
- После цикла ожидаешь весь список асинхронных функций (действием "Ждать завершения асинхронной функции", указав переменную со списком потоков).
Про успешно или не успешно выполнилась функция: я обычно просто вывожу в асинхронных фукнциях лог об успешном завершении в самом конце с номером потока. Success в таком случае можно убрать (он и не нужен), можно оставить (основной поток это не прервет, только завершит текущий поток асинхронной функции). Известные возможные ошибки обрабатываю и вывожу в лог красным цветом и прерываю поток действием "Fail".
Про перезапуск потока в Success из асинхронной функции: это не перезапустит ни основной поток, ни любой другой поток. Это просто успешное завершение текущего потока без перезапуска.
Про счетчик: в основном потоке я создаю глобальную переменную со значением 0. В асинхронных функциях ставлю условие IF, проверяю либо какое-то значение, либо успешный запрос, либо успешное модальное окно и, если все хорошо, увеличиваю глобальную переменную на 1. В конце скрипта можно вывести сколько потоков завершились успешно, использовав эту глобальную переменную.
Важное замечание про данные (переменные) в асинхронных функциях: передавать переменные в асинхронные функции можно только через "параметры функции", "глобальные переменные" или "ресурсы".
Если не знакомы с асинхронными функциями: видео про асинхронные функции
-
@gurkin4 Ну не сказал бы, что это так сложно). Да и, наверное, лучше сразу привыкать к хорошим паттернам. Какая бы сложная логика не была, ее легко можно расширить как душе угодно и точечно управлять функциями.
А количество меток при сильном усложнении скрипта могут запутать самого разработчика, стараюсь использовать только если очень лень что-то менять. А если не дай бог скрипт очень тяжелый, и смотрит его другой пользователь, большой шанс с его стороны сойти с ума.
-
@SecDeveloper Не думаю, что для данного проекта понадобится много меток, примерно 5 штук.
-
Господа, Вы совершенно не ответили на главный вопрос: сколько "удачных-неудачных" выставить для функции выполняемой в 10 потоков (чтобы каждый поток отработал только один раз) - это 1 или это 10?
Про Succes - это дополнительные вопросы (чтоб два раза не "вставать") - тут спасибо - всё понятно.
Логика - это как работает настройка "удачные-неудачные" - вот чего я раздуплить не могу.
По поводу организации скрипта - там всё максимально просто:
Счётчик в каждом потоке "при старте" равняется номеру потока, в конце цикла увеличивается на число равное колличеству потоков (в данном случае 10).
Таким образом первый поток отработает элементы 1, 11, 21, 31 и т.д - второй отработает 2, 12, 22, 32 и т.д. - это простейший способ избежать возможных дублей.
Условием цикла является, что счётчик должен быть меньше или равен колличеству "элементов" (в моём случае строк экселя, откуда и берутся все данные по сайтам).
В моём случае в цикле есть ещё одно условие - если счётчик равен 1, то плюсуй к нему 10 - ибо первой строкой екселя у меня идут названия столбцов.