Помогите с логикой

Поддержка
  • В проекте "глабальный" цикл в 1 поток.
    Он берёт новость, подготавливает её и запускает функцию в 10 потоков.
    После чего увеличивает счётчик и берёт следующую новость.

    Функция же, запускаемая в 10 потоков, представляет из себя цикл отправки новости на сайты.
    В конце функции на всякий случай запихан Succes.

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

    Подскажите пожалуйста как правильно выставить "Успешные - Неуспешные" настройки для функции (1 или 10?)...

    Второй вопрос: не прервёт ли действие Succes "глобальный" цикл?

    Третий вопрос: Не перезапустит ли Succes поток, так как нет опции как в Fail "не перезапускать поток"?

  • @LCFSCS
    Логика:

    1. В основном потоке можно поставить цикл FOR от 1 до 10.
    2. В цикл засунуть нужную асинхронную функцию (действие "Вызвать функцию асинхронно").
    3. После цикла ожидаешь весь список асинхронных функций (действием "Ждать завершения асинхронной функции", указав переменную со списком потоков).

    Про успешно или не успешно выполнилась функция: я обычно просто вывожу в асинхронных фукнциях лог об успешном завершении в самом конце с номером потока. Success в таком случае можно убрать (он и не нужен), можно оставить (основной поток это не прервет, только завершит текущий поток асинхронной функции). Известные возможные ошибки обрабатываю и вывожу в лог красным цветом и прерываю поток действием "Fail".

    Про перезапуск потока в Success из асинхронной функции: это не перезапустит ни основной поток, ни любой другой поток. Это просто успешное завершение текущего потока без перезапуска.

    Про счетчик: в основном потоке я создаю глобальную переменную со значением 0. В асинхронных функциях ставлю условие IF, проверяю либо какое-то значение, либо успешный запрос, либо успешное модальное окно и, если все хорошо, увеличиваю глобальную переменную на 1. В конце скрипта можно вывести сколько потоков завершились успешно, использовав эту глобальную переменную.

    Важное замечание про данные (переменные) в асинхронных функциях: передавать переменные в асинхронные функции можно только через "параметры функции", "глобальные переменные" или "ресурсы".

    Если не знакомы с асинхронными функциями: видео про асинхронные функции

  • Как всё сложно! Да создайте вы переменную 1 и увеличивайте на 1, переходя по меткам. Если эта переменная будет больше 10, то перейти к другой метке или в конец скрипта для завершения.

  • @gurkin4 Ну не сказал бы, что это так сложно). Да и, наверное, лучше сразу привыкать к хорошим паттернам. Какая бы сложная логика не была, ее легко можно расширить как душе угодно и точечно управлять функциями.

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

  • @SecDeveloper Не думаю, что для данного проекта понадобится много меток, примерно 5 штук.

  • @gurkin4 Ну в этом Вы правы)

  • Господа, Вы совершенно не ответили на главный вопрос: сколько "удачных-неудачных" выставить для функции выполняемой в 10 потоков (чтобы каждый поток отработал только один раз) - это 1 или это 10?

    Про Succes - это дополнительные вопросы (чтоб два раза не "вставать") - тут спасибо - всё понятно.

    Логика - это как работает настройка "удачные-неудачные" - вот чего я раздуплить не могу.

    По поводу организации скрипта - там всё максимально просто:

    Счётчик в каждом потоке "при старте" равняется номеру потока, в конце цикла увеличивается на число равное колличеству потоков (в данном случае 10).
    Таким образом первый поток отработает элементы 1, 11, 21, 31 и т.д - второй отработает 2, 12, 22, 32 и т.д. - это простейший способ избежать возможных дублей.
    Условием цикла является, что счётчик должен быть меньше или равен колличеству "элементов" (в моём случае строк экселя, откуда и берутся все данные по сайтам).
    В моём случае в цикле есть ещё одно условие - если счётчик равен 1, то плюсуй к нему 10 - ибо первой строкой екселя у меня идут названия столбцов.