Объясните почему должно быть так, а получается по другому)

Поддержка
  • Начну из далека, а потом ближе к своей проблеме

    Есть такой блок к БАС "Вызов функции в несколько потоков". Приведём сразу пример. Вот я создал этот кубик в Main и вызываю функцию, назовем её asdf, в 2 потока с параметрами 10 успешных выполнений или 10 неуспешных выполнений. eb18a62e-d760-420d-920a-c4edfeabf811-image.png
    В самой этой функции 3 действия:
    9cf82156-647d-4f9c-b272-2ea3ac3cb5af-image.png
    То есть, как работает вообще многопоток. Запускается один или несколько, в зависимости от наших предпочтений, основной поток, например Поток№1, который в свою очередь запускает Поток№2 и Поток№3, то есть два второстепенных(наш случай), а сам в свою очередь уходит в бездействие, пока эти второстепенные потоки не закончат свою работу. Вроде я правильно описал работу многопотока
    Вернемся к нашему случаю. Запустим этот скрипт в 2 потока(тобишь основных) и вот к чему это приводит:
    caba94fa-5eab-4e87-8c19-3dd3d7e3e378-image.png
    В приципе всё понятно. Понятно почему выполнилось 22 раза, по 11 раз на каждый основной поток, хоть и стояло 10, если кому непонятно то вот https://community.bablosoft.com/topic/15195/вызов-функции-в-несколько-потоков-запутался/4?_=1689769190676
    Самая главная суть, что основной поток завершается по достижении 10 успешных выполнений в сумме по второстепенным потокам. То есть например Поток№3, который является второстепенным потоком основного потока Поток№1, может выполниться 3 раза успешно, а Поток№4, который также является второстепенным от Потока№1, может выполниться оставшиеся 7 раз успешно.
    Если в функции asdf убрать блок Success, ничего не измениться, лишь измениться сообщение с "йцукен" на "". В принципе всё понятно.

    Если выставить в Типе запуска "Повторять", то по завершении исполнения всех второстепенных потоков и их следствия завершения основного потока запуститься скрипт заново:
    0828e14b-7e5c-4d8d-b265-46c76e6720dd-image.png
    Тоже всё понятно. То есть пока не завершатся второстепенные потоки и их основной поток, скрипт не начнет их(второстепенные потоки) заново запускать.

    Вроде бы работу блока "Вызов функции в несколько потоков" я описал правильно.

    Теперь переходим к моей проблеме.
    Вначале постараюсь объяснить что есть в моем скрипте:
    7c2df23f-4bd9-4d32-82e1-8ef6e1e66327-image.png Скриншот№1
    7a20046e-d8a5-4f12-bda3-8f4418dacc39-image.png Скриншот№2
    bb2003c0-81a3-4e40-a074-db31cc52796f-image.png Скриншот№3
    В остальных if(где происходит распределение по номеру потока) всё похоже, но берутся другие сайты и другие ресурсы используются

    Суть моего скрипта, будем разбирать режим "Spammer", потому что с ним у меня и основная проблема. Внутри функции "[Название сайта]Spam" из ресурса "Аккаунты" берется строка с логином:паролем, авторизуется на сайте, и начинает спам по юзерам,id которых также находятся в ресурсе "Users". И так для каждого сайта, распределенного по Номеру основного потока, то есть IF [[THREAD_INDEX]]==1 - то поток переходит в функции связанные с сайтом№1 и тд. (понимаю, что идей как это реализовать структуру лучше много, но мне удобно так)
    Попрошу обратить внимание на разницу скриншотов №2 и №3.
    На скриншоте №2 основной поток не создает второстепенные в режиме "Spammer", а работает сам. Связано это с тем, что интервал отправки сообщения маленький, и пройти по 40 строкам логинов:паролей из ресурса "Аккаунты" в цикле, пока закончаться эти строки, поток может быстро, поэтому нет смысла нагружать систему запуском нескольких потоков.
    *На скриншоте №3 * основной поток в режиме "Spammer" создает несколько потоков, в моем случае 10 с 1000 успешными/неуспшеными выполнениями. В ресурсе "Аккаунты" от этого сайта находятся также 40 строк логин:пароль, поэтому число 1000 было написано наобум, хоть можно было бы написать 40, чего хватило бы чтоб пройтись по всем аккаунтам. Но не суть важно. Почему я запускаю здесь несколько потоков, думаю объяснять не надо, но на всякий случай. Связано это с большим интервалом отправки сообщения. Чтобы здесь пройти по 1ому циклу(по одному аккаунту) требуется 1 час, и если бы работа была в однопотоке то на это ушло бы 40 часов(а есть где один цикл занимает 6 часов, то это вообще опа). По этому на этот сайт был выбран блок "Вызов в несколько потоков", чтоб по идеи пройтись по всем акаунтам за 4 часа (1ч4 цикла по 10 аккаунтов за раз)

    И получается в работе у меня 8 сайтов, где 5 из них работают в однопотоке(в основном тобишь) и 3 других запускаются в несколько потоков. В сумме должно работать 45(1+1+1+1+1+20+10+10) потоков.

    Как работу скрипта вижу я. Тип запуска "Повторять" дефает потоки, которые работают в однопоток, от непредвиденных ошибок во время работы и их дальнейшей остановки. Количество успешных/неуспешных выполнений в число 1000 дефает от ошибок и остановки потоки, которые запускаются в многопоток. И единственное от чего могут остановиться потоки - это когда закончатся строки в ресурсе "Аккаунты" для каждого сайта. Где в каждом таком ресурсе для каждого сайта 40 строк

    А как работает у меня скрипт на самом деле:

    1. Один или несколько из основных потоков, который работает в соло, может просто с ничего завершиться(с ошибкой или даже без) пройдя по, например, 7 строкам аккаунтов, хоть в ресурсе будет написано что осталось 33. Причем остальные соло-потоки могут пройтись по всем и логично завершить работу, когда строк аккаунтов не осталось в ресурсе.
    2. Основные потоки, которые запускают второстепенные потоки (для удобства буду писать поток-многопоток). Один из них может пройти по 20 строчкам аккаунтов и закончить работу, отписав также что их основной поток завершил работу(при этом видно в отчете о ресурсах, что аккаунты еще есть). Другой может, например, также пройтись по 20 строчкам закончить работу, при этом основной поток не завершиться и будет просто висеть где-то в небытие. Третий может и вовсе завершиться сразу после прохождения первых 10 строчек не перейдя даже к следующим, то есть успешных выполнений 10 из 1000, но он всё равно завершился, хоть и осталось в ресурсе 30 аккаунтов. Как итог за неделю таких запусков, НИ РАЗУ потоки-многопотоки не завершили свою работу пройдя ПОЛНОСТЬЮ по всем аккаунтам.

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

    И кто уже прочел до этого момента, я вас уже очень ценю)

    Проблему вы мою услышали и прочли. В чём заключаются мои вопросы:

    1. Почему у меня так происходит? Почему потоки невиданным образом завершаются, когда они, по идеи, не должны?
    2. Подскажите пожалуйста как можно исправить эту проблему, чтобы она не повторялась, и скрипт прорабатывал все строки и завершал работу через 10+- часов, как он должен это делать по моим подсчетам
    3. Может дело в самих ресурсах или их параметрах, может в ресурсе прокси(о котором я забыл упомянуть), может в выставлении Типа запуска на "Повторять", может в выставлении количества успешных/неуспешных выполнений. Я просто уже не знаю куда мне копать, чтобы решить эту проблему и спокойно запускать скрипт без нервотрепок. Больше недели сижу и не понимаю почему так, когда должно быть по другому?

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