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

Поддержка
  • @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 параллельно появится и возможность на живую создавать новые потоки.