Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?



  • Т.е. хочу сделать так, чтобы основной поток запускал функцию в одном дополнительном потоке. Затем запущенная функция запускала еще один поток, а сама продолжала работать и так далее... После завершения всех запущенных в отдельных потоках функций действие возвращалось в основной поток. Возможно ли такое?



  • как вариант:
    Создать глобальный ресурс 0
    дальше статистика скрипта-номер потока
    если поток==1, то ждать глобальный ресурс
    иначе остальные потоки наполняют глобальный ресурс



  • @senerg said in Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?:

    Т.е. хочу сделать так, чтобы основной поток запускал функцию в одном дополнительном потоке. Затем запущенная функция запускала еще один поток, а сама продолжала работать и так далее... После завершения всех запущенных в отдельных потоках функций действие возвращалось в основной поток. Возможно ли такое?

    Алгоритм составлен очень не подходящим для bas образом.

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

    Потоки в бас предназначены для распределения ресурсов. Ищите другое решение.



  • @xclsv said in Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?:

    надежность скрипта с ожиданием переменных в соседних потоках будет падать

    Я подозревал, что многопоточность, если можно так выразиться, тут не полноценная. А с чем связана ненадежность?

    Мне казалось, что это самый эффективный способ организовать парсинг. Т.е. скрипт переходит на следующую страницу с выдачей в новом потоке и там смотрит есть ли переход на следующую страницу. Если есть, то запускает парсинг ее в новом потоке, а сам продолжает парсинг уже заргуженной страницы. Не знаете другой вариант, который лучше подойдет для BAS?



  • @senerg Да все тут нормально, просто подход неверный. Если подход слишком сложный то скорей всего он не оптимальный. Все гораздо проще. Каждый подход должен работать с своим диапазоном страниц. Например если 2 потока, то поток 1 берет только четные, 2 поток соответственно нечетные. Формулу для вычисления номеров страниц оставлю вам. Подскажу, что в ней используется число потоков, номер тек. потока и номер итерации цикла.



  • @denis_krsk Я имел в виду, что каждая страница для парсинга в отдельном потоке. Т.е. 100 страниц = 100 потоков. Просто сколько именно будет страниц не известно до тех пор пока не получишь страницу и не проверишь, есть ли на ней кнопка перехода на следующую страницу.



  • @senerg Я вам дал оптимальное решение. И потом эти ваши 100 страниц = 100 потоков будет жрать кучу ресурсов...



  • @denis_krsk said in Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?:

    100 потоков будет жрать кучу ресурсов

    Так на запросах же и через прокси.

    @denis_krsk said in Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?:

    Я вам дал оптимальное решение

    Ваше решение подразумевает переход на следующую страницу в одном потоке. А я планировал обойтись без этого.



  • @senerg
    Для Вашей задачу лучшим решением будет определить количество страниц, которые будут парситься и уже потом распределить их между потоками.



  • @xclsv он весь али хочет спарсить.



  • @uraabk
    Ради бога ) Буду только рад помочь )



  • @senerg said in Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?:

    А с чем связана ненадежность?

    Ненадежность связана с тем, что вам придется реализовать искусственный триггер на запуск действий через ожидание какого-то значения глобальной переменной в соседнем потоке. На каждый поток нужна своя переменная, иначе могут триггернуться не те потоки, какие бы вы захотели. А я так понял, заранее вы не знаете, сколько понадобится потоков, читай переменных. Нужно будет как-то останавливать потоки. Не будут же они ждать переменных вечно. Появятся сложности при отладке, т.к. в режиме записи запустится только 1 поток.
    Вы хотите запускать скрипт/функцию в неопределенное количество потоков. Даже если это было бы возможно, сказать, что это неоптимальное решение - значит ничего не сказать.
    Да, конечно же ещё вы можете дописывать ресурс со страницами каждый раз, когда увидите, что новая страница есть, перегружать ресурс и надеяться, что страницы будут добавляться быстрее, чем потоки скушают их все. Но все же лучшим решением будет распределить между потоками определенное количество страниц. Это хотя бы соответствует принципам работы многопотока в басе.



  • @senerg Вы может запустить хоть 100 потоков и каждый поток будет всегда брать только свои страницы, если все грамотно реализовать. Плюс такого решения, что не надо знать количество страниц. Надо только посмотреть какой ответ будет в случае если такой страницы нет



  • Да, я уже понял, спасибо. Просто думал, что захотел отдельный поток, как обычно new Thread() и погнали. А в басе так нельзя.



  • @senerg said in Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?:

    захотел отдельный поток, как обычно new Thread() и погнали. А в басе так нельзя.

    Если правильно продумать логику, то можно сделать аналог этой функции через действие "Вызов функции в несколько потоков", или реализовать в той же ноде.

    @support не так давно писал:
    @support said in Конструктор интерфейса.:

    Вызов функции БАС - это отдельная тема и будет в отдельном релизе.
    Этот функционал позволит менять структуру скрипта. Например, пользователь нажимает кнопку "Зарегистрировать аккаунты" и в БАС вызывается функция "RegisterAccounts". Интерфейс получает промис, который вернет результат, когда завершиться функция в БАС. Таким образом, не нужно будет заполнять ресурсы, перезапускать скрипт, и т. д., а прямо из интерфейса вызывать функционал, в том числе и параллельно.

    Возможно с появлением метода вызова функций BAS параллельно появится и возможность на живую создавать новые потоки.


Log in to reply