@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
[[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга
-
@allive , Да как угодно можно. Если бы только была хоть какая-то документация, описывающая что можно, что нет. А так написал код за 10 минут, проверил на яваскрипте - работает. Потом в басе сидишь целый день и отгадываешь где скобочка нужна, где пробелов понаставить, где слэш не подошел...
Хотя в целом-то БАС работает, хорошая прога. -
@senerg самое не заморочное и кода нет проблем с массой переменных объявляем [[TEMP]] число 0 если вы идете например по if и меткам и увеличиваем ее вот вам и номера итерации вложения. Можно не только if любой просто при некоторых реализациях и temp не над bas умеет работать со списками он сам остановит цикл кода все кончилось. достаточно поставить галку удалять из списка
-
@senerg said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
А так написал код за 10 минут, проверил на яваскрипте - работает.
Так если вы хорошо знаете яваскрипт, зачем вам Бас? Есть ведь всякие tampermonkey, помогающие работать со скриптами...
-
@senerg said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Если бы только была хоть какая-то документация
https://github.com/bablosoft/BAS и не хоть какая а кишки только надо уметь читать. Вы можете себе представить что первые пользователи unix - ов бегали и требовали мануал? Не доки, а картинки кнопки скриншоты?
Бас это новое. Трудно с нуля такие мануалы писать. И не нужно. Это не игрушка в конце концов. Это мы тут развлекаемся я балоболю да бодаюсь с ботами и смотрю что чего веселее наговнокодил. А вообще то басом легко можно брутить и я вам назвал только самоооое малонезаконное.
https://community.bablosoft.com/category/30/заказать-скрипт норот вон даже не стесняетсязнаете софт mass tunneler 😁 так вот знаете что басом легко можно его заменить? не чекать бас можно самого сделать tunneler -ом
лан все равно уже сказал а
https://github.com/bablosoft/BAS/issues/4
б разраб это тоже быстро понял)) переходить бесполезно -
@uraabk said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Так если вы хорошо знаете яваскрипт, зачем вам Бас?
Не то чтобы хорошо, просто там получается быстрее, и что не знаешь можно быстро нагуглить. А тут попробуй нагугли, например, как сохранить файл с урл строчкой кода в басе. Хрен там. Да и пока эти кубики настроишь и с пробелами и скобочками разберешься...
-
@senerg said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
@uraabk said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Так если вы хорошо знаете яваскрипт, зачем вам Бас?
Не то чтобы хорошо, просто там получается быстрее, и что не знаешь можно быстро нагуглить. А тут попробуй нагугли, например, как сохранить файл с урл строчкой кода в басе. Хрен там. Да и пока эти кубики настроишь и с пробелами и скобочками разберешься...
Так если с Басом такие сложности, то не лучше ли найти что то более удобное, понятное? На что написано много гайдов...
-
@uraabk said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
найти что то более удобное, понятное?
Боюсь бесплатных или работающих вылеченных аналогов с таким же функционалом просто нет.
@allive said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Т.е. было много попыток и далеко не 20% удачные
К сожалению, тут вы правы.
-
@senerg said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
работающих вылеченных аналогов
Нужно больше ботов в сети, нужно больше ботов))
Бот в данном случае будете не ваше поделие, а ваш компьютер. Ну и вы соответсвеноbotnet
https://community.bablosoft.com/topic/5261/я-плачу-весь -
@sten30 said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Интересно, что ответ так и не дали.
Я первым же сообщением дал корректный ответ

Я решил проблему так - записываю CYCLE_INDEX в другую переменную, после этого задержка, и после вложенного цикла возвращаю номер обратно в CYCLE_INDEX .
Проще создайте перед циклом две переменных с значением
0, и внутри каждого цикла первым действием увеличивайте отдельную переменную. В такой конструкции не будет неожиданностей с переопределением. -
-
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Проще создайте перед циклом две переменных с значением 0, и внутри каждого цикла первым действием увеличивайте отдельную переменную. В такой конструкции не будет неожиданностей с переопределением.
Тут есть небольшая проблема.
Если в кастомном модуле в функции есть цикл, то код из кастомного модуля затрет переменную CYCLE_INDEX в коде пользовательского скрипта своим значением.
С другими подобными переменными такая же проблема.
Вероятно, надо в коде функции кастомного скрипта перед объявлением цикла проверять есть ли такая переменная(она может быть объявлена в коде пользовательского скрипта), если есть, то сохранять ее и восстанавливать значение до возврата из функции.
Причем нужно восстанавливать значение при любом поведении, в том числе если функция из модуля упадет, чтобы пользователь не увидел свои изменённые переменные и долго не думал "что за фигня тут у меня".
Это если пользователь решит обернуть вызов функции из модуля в ошибку.Выглядит жутким хаком.
Если кому то надо, вот список глобальных переменных, не всех их надо сохранять и восстанавливать.
VAR_CYCLE_INDEX VAR_FOREACH_DATA VAR_FOR_EACH_CSS VAR_FOR_EACH_MATCH VAR_FOR_EACH_XPATH VAR_WAS_ERROR VAR_LAST_ERROR VAR_ERROR_ID VAR_CYCLE_INDEX VAR_FOREACH_DATA VAR_FOR_EACH_CSS VAR_FOR_EACH_MATCH VAR_FOR_EACH_XPATH VAR_WAS_ERROR VAR_LAST_ERROR VAR_ERROR_IDОбщую идею, как это можно делать, можно почитать тут:
https://community.bablosoft.com/topic/25851/проблема-при-вызове-функции/30 -
@sergerdn said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Проще создайте перед циклом две переменных с значением 0, и внутри каждого цикла первым действием увеличивайте отдельную переменную. В такой конструкции не будет неожиданностей с переопределением.
Тут есть небольшая проблема.
Если в кастомном модуле в функции есть цикл, то код из кастомного модуля затрет переменную CYCLE_INDEX в коде пользовательского скрипта своим значением.
С другими подобными переменными такая же проблема.
Вероятно, надо в коде функции кастомного скрипта перед объявлением цикла проверять есть ли такая переменная(она может быть объявлена в коде пользовательского скрипта), если есть, то сохранять ее и восстанавливать значение до возврата из функции.
Причем нужно восстанавливать значение при любом поведении, в том числе если функция из модуля упадет, чтобы пользователь не увидел свои изменённые переменные и долго не думал "что за фигня тут у меня".
Это если пользователь решит обернуть вызов функции из модуля в ошибку.Выглядит жутким хаком.
Проблема переменных BAS в модулях имеют более глобальные последствия, ведь многие используют в действиях стандартные названия переменных, а затем из этих действий создают модули, которые и вызывают проблемы перезаписи переменных со стандартными названиями. Об этой проблеме уже есть тикет, есть несколько возможных решений, но пока единственный надёжный способ, это в ручную править код заменяя переменные BAS на переменные js (var VAR_CYCLE_INDEX и т.д.)
-
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
проблема переменных BAS в модулях имеют более глобальные последствия
Да. Но основная проблема не в существующем поведении, а в том, что нет документации на этот счет, пользователи расшибают лбы об стенку самостоятельно.
И нет инструкция с обходными путями. Пользователи сами придумывают костыли, как избежать этого.
Хотя логика простая - если до вызова функции некий список переменных был объявлен(CYCLE_INDEX, VAR_FOREACH_DATA, etc), то перед вызовом функции сохранять их значения и восстанавливать после возврата.
Вот прямо сейчас я это и делаю на основании твоего же кода.
P.S.
У модулей должен быть своя видимость области переменных, это решит почти все проблемы. -
@sergerdn said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
проблема переменных BAS в модулях имеют более глобальные последствия
Да. Но основная проблема не в существующем поведении, а в том, что нет документации на этот счет, пользователи расшибают лбы об стенку самостоятельно.
И нет инструкция с обходными путями. Пользователи сами придумывают костыли, как избежать этого.
Хотя логика простая - если до вызова функции некий список переменных был объявлен(CYCLE_INDEX, VAR_FOREACH_DATA, etc), то перед вызовом функции сохранять их значения и восстанавливать после возврата.
Вот прямо сейчас я это и делаю на основании твоего же кода.
P.S.
У модулей должен быть своя видимость области переменных, это решит почти все проблемы.Не уверен, что область видимости можно ограничить в BAS. Можно поступить с переменными, как с функциями - добавить опцию, что бы генерировать длинные случайные названия переменных, заменяя используемые в функции при создании модуля
-
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Не уверен, что область видимости можно ограничить в BAS
Пользователям нельзя, разработчику думаю можно все.
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Можно поступить с переменными, как с функциями - добавить опцию, что бы генерировать длинные случайные названия переменных
Кстати идея, задумался не написать ли мне сейчас скрипт, который делает post-process модуля, превращая все переменные внутри функции модуля в случайные названия.
-
@sergerdn said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Пользователям нельзя, разработчику думаю можно все.
Если реализация изоляции переменных BAS в модуле будет требовать больших изменений в текущей логики работы BAS, то разработчик этого делать не будет.
Кстати идея, задумался не написать ли мне сейчас скрипт, который делает post-process модуля, превращая все переменные внутри функции модуля в случайные названия.
Да, я вроде даже выкладывал скрипт для замены имён переменных в модуле, не помню только где именно.
-
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
Да, я вроде даже выкладывал скрипт для замены имён переменных в модуле, не помню только где именно.
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
это в ручную править код заменяя переменные BAS на переменные js (var VAR_CYCLE_INDEX и т.д.)
Если в файле engine.js заменить все переменные, которые начинаются с VAR на что-то другое, то это пройдет без побочных эффектов?
было:
VAR_LOG_PREFIX = _function_argument("_log_prefix") var json = JSON.parse(native("filesystem", "fileinfo", VAR__DIRECTORY_PATH)) VAR_FILEINFO_EXISTS = json["exists"]стало:
_LOG_PREFIX = _function_argument("_log_prefix") var json = JSON.parse(native("filesystem", "fileinfo", __DIRECTORY_PATH)) _FILEINFO_EXISTS = json["exists"] -
@sergerdn said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
@Fox said in [[CYCLE_INDEX]] в двух циклах FOR вложенных друг в друга:
это в ручную править код заменяя переменные BAS на переменные js (var VAR_CYCLE_INDEX и т.д.)
Если в файле engine.js заменить все переменные, которые начинаются с VAR на что-то другое, то это пройдет без побочных эффектов?
было:
VAR_LOG_PREFIX = _function_argument("_log_prefix") var json = JSON.parse(native("filesystem", "fileinfo", VAR__DIRECTORY_PATH)) VAR_FILEINFO_EXISTS = json["exists"]стало:
_LOG_PREFIX = _function_argument("_log_prefix") var json = JSON.parse(native("filesystem", "fileinfo", __DIRECTORY_PATH)) _FILEINFO_EXISTS = json["exists"]По идее должно работать, однако вы меняете одни глобальные переменные js на другие.