Try using "Template" action and construct your text with hyerlinks than paste it to page.
Other option is to create simple LOCAL html page somewhere on your hard disk with
desired text and links, than open that local html page in another tab in BAS and than copy
from that tab to the tab where you are working.
LOCK в многопотоке
-
@senerg said in LOCK в многопотоке:
В старом видео про многопоточность автор баса говорил, что готовит функцию LOCK для одновременной записи в глобальную переменную из разных потоков. Где ее можно найти в басе?
Зачем нужна эта функция? Что мешает просто писать данные в глобальную переменную?
-
@senerg Где то у меня был тестовый скрипт, где я проверял на возможные ошибки одновременную запись. Я в 100 потоков с рандомными задержками записывал случайную строку в глобальную переменную и следом сразу проверял, что если в глобальной переменной другая строка, то прекратить скрипт. В итоге скрипт отработал 10 минут без каких либо ошибок. Думаю в рабочем скрипте более жёстких условий одновременной записи в глобальную переменную не будет.
-
@Denis_krsk В этом и фишка, что скорее всего lock в многопотоке уже реализован, по аналогии с записью в ресурс.
-
@fox , @Denis_krsk , @xclsv
Например, в нескольких потоках делаю гет запрос, пересчитываю количество ссылок, которые есть в ответе, увеличиваю глобальную переменную на это количество.
Я два дня читал про многопоточность в басе, пока не понял, что ее просто нет. Вместо нее есть возможность запускать несколько экземляров одной и той же функции в несколько потоков с возможностью чтения общих данных каждым потоком. И все. По факту многопоточности нет. Нельзя взять данные из одного потока, обработать в другом и вернуть обратно. -
@senerg Я уже год почти работаю с БАС, написал уйму скриптов и не было таких задач, которые я не смог решить. И кстати данные взять и обработать можно, есть ресурсы, есть глоб переменные. В конце концов есть node можете кодить там как душе угодно.
-
@senerg said in LOCK в многопотоке:
А несколькими потоками увеличивать одну и ту же переменную нельзя если есть асинхронные действия.
Вы сами то поняли что написали? Чем ваши асинхронные действия помешают увеличивать глобальную переменную?
-
@senerg said in LOCK в многопотоке:
@fox , @Denis_krsk , @xclsv
Например, в нескольких потоках делаю гет запрос, пересчитываю количество ссылок, которые есть в ответе, увеличиваю глобальную переменную на это количество.То, для чего Вы пытаетесь придумать велосипед, делается иначе. Сначала в однопотоке пересчитывается количество ссылок. Затем в многопотоке эти ссылки обрабатываются.
@senerg said in LOCK в многопотоке:
Я два дня читал про многопоточность в басе, пока не понял, что ее просто нет. Вместо нее есть возможность запускать несколько экземляров одной и той же функции в несколько потоков с возможностью чтения общих данных каждым потоком. И все. По факту многопоточности нет. Нельзя взять данные из одного потока, обработать в другом и вернуть обратно.
Многопоточность есть. Просто она работает не так, как Вы себе это представляете. При этом Вы не ещё даже не пытались подумать, с какими проблемами столкнётесь, если она будет работать именно так, как Вам нужно.
Проблем не в бас и его функционале, а в том, что Вы не придумали алгоритм и не предусмотрели обработку ошибок, которые будут возникать при его реализации. -
@xclsv said in LOCK в многопотоке:
Проблем не в бас и его функционале, а в том, что Вы не придумали алгоритм и не предусмотрели обработку ошибок, которые будут возникать при его реализации.
Полностью согласен. Я же не говорю, что бас вдруг стал плохим, просто при придумывании алгоритма нужно учитывать возможности и особенности бас при чем не только в многопотоке и формировать алгоритм под бас, а не придуманный алгоритм брать и натягивать на бас. Самое большое неудобство заключается в том, что нет мануала, где было бы написано, что можно а что работать не будет.
@denis_krsk said in LOCK в многопотоке:
Если в скрипте есть асинхронные действия это нормально, я говорил только о том, что бы между чтением и записью глоб переменной их не было
Значит если функция, запущенная в многопотоке, сначала делает какие-то асинхронные действия, затем читает глобальную переменную, обрабаывает ее только синхронными действиями, а затем записывает полученное значение в эту же глобальную переменную, то проблем не будет не зависимо от колчества запущенных потоков?
-
Если в скрипте есть асинхронные действия это нормально, я говорил только о том, что бы между чтением и записью глоб переменной их не было
Значит если функция, запущенная в многопотоке, сначала делает какие-то асинхронные действия, затем читает глобальную переменную, обрабаывает ее только синхронными действиями, а затем записывает полученное значение в эту же глобальную переменную, то проблем не будет не зависимо от колчества запущенных потоков?
Да!
Полностью согласен. Я же не говорю, что бас вдруг стал плохим, просто при придумывании алгоритма нужно учитывать возможности и особенности бас при чем не только в многопотоке и формировать алгоритм под бас, а не придуманный алгоритм брать и натягивать на бас. Самое большое неудобство заключается в том, что нет мануала, где было бы написано, что можно а что работать не будет.
Ну в любом языке есть свои особенности которые учитываются. А если чего-то нет или непонятно из мануала, то это легко узнается с помощью тестов.
-
@xclsv , она есть, но с ограничениями. Вы не можете создавать новый поток когда вам вздумается. Вы не можете запустить в многопотоке функцию, в которой между чтением и записью в глобальную переменную есть асинхронное действие. И еще наверняка много других ограничений, о которых я пока не знаю. Есть так как есть, и огромная благодарность автору баса за то, что есть хоть так. Даже в текущем воложении этого более чем достаточно для 90% задач.
Я лишь говорю о том, что нет мануала о том что можно, что нет. И пока сам носом не натыкаешься на все эти особенности о них и не узнаешь. -
@senerg said in LOCK в многопотоке:
Вы не можете создавать новый поток когда вам вздумается
Да, действия new Thread() в BAS'e из коробки пока нет.
Вы не можете запустить в многопотоке функцию, в которой между чтением и записью в глобальную переменную есть асинхронное действие.
Почему? Всегда пользовался именно таким алгоритмом. Вам уже много раз говорили, запись в глобальную переменную работает правильно и логично. Выкиньте слово асинхронные действия из своего лексикона, пока не поймёте что это такое (без обид).
Представьте ведро

В него не глядя накладывают раствор 5 строителей, если строитель будет смотреть в ведро сразу как положил в него раствор, он будет всегда знать, сколько его сейчас в ведре.Так и с глобальной переменной, увеличить или записать новые данные в глобальную переменную можно без ограничений, но у вас может получиться неправильная логика, если проверять раствор в ведре не сразу.
-
@senerg said in LOCK в многопотоке:
@xclsv , она есть, но с ограничениями. Вы не можете создавать новый поток когда вам вздумается. Вы не можете запустить в многопотоке функцию, в которой между чтением и записью в глобальную переменную есть асинхронное действие. И еще наверняка много других ограничений, о которых я пока не знаю. Есть так как есть, и огромная благодарность автору баса за то, что есть хоть так. Даже в текущем воложении этого более чем достаточно для 90% задач.
Я лишь говорю о том, что нет мануала о том что можно, что нет. И пока сам носом не натыкаешься на все эти особенности о них и не узнаешь.Я так понял, Вы решаете задачу парсинга неизвестного количества страниц. Что мешает посчитать их количество и потом распределить в многопотоке? Не нужно будет пользоваться глобальными переменными. Не нужно будет заморачиваться с добавлением потока и асинхронными действиями. К тому же это намного эффективнее и по времени и по ресурсам. Уже предлагал это в соседней теме, может не увидели.