Можно ли запустить функцию в отдельном потоке, не останавливая поток, который ее вызвал?
-
Т.е. хочу сделать так, чтобы основной поток запускал функцию в одном дополнительном потоке. Затем запущенная функция запускала еще один поток, а сама продолжала работать и так далее... После завершения всех запущенных в отдельных потоках функций действие возвращалось в основной поток. Возможно ли такое?
-
как вариант:
Создать глобальный ресурс 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 параллельно появится и возможность на живую создавать новые потоки.