@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
Бас Шалит в Многопотке
-
Другое подходящее название я подобрать не смог. Суть проблемы.
В каждом потоке бас играет в игру набирает скор. Бас выступает в роли человека то-есть логики действий - решает игру js код в кубике Яваскрипт и уже на основе этого решения бас делает ход.
И суть проблемы такова чем больше потоков запущено тем хуже бас играет. условно с одним запущеним потоком(1 поток- 1аккаунт - 1 гра(не связаны)) он наберёт 1000 скора а с 10 потоками только 200. Закономерность такова чем больше потоков работает там хуже он играет.В можете возразить и указать на такие возможные проблемы...
Ты загружаешь пк сильнее и бот от того хуже решает.- Нет. Бот запускается на машине где загрузка при 20 потоках не более 50%.
Ты используешь глобальные переменные и результаты между потоками мешаются. - Ни одна глобальная переменная не была использована. Боле того я тоже на это грешил поэтому в качестве переменной куда записывается решение выступает список и каждый поток пишет данные в свою ячейку хотя и список тоже свой в каждом потоке так как он не глобален, ну да ладно.
- Ты не приставил тестовый скрпит.
Бот настолько широк и интегрирован с игрой что тут либо только весь скрипт кидать, да и то нужны аккаунты в играх.
- Нет. Бот запускается на машине где загрузка при 20 потоках не более 50%.
-
Пробовал запускать 10 экземпляров скрипта одновременно? Можно скомпилированный скрипт положить в 10 папок и дать ему 10 разных аккаунтов.
P.S.
Доподлинно не знаю, как работает BAS с NodeJS/Javascript , но NodeJS/Javascript однопоточный, это значит, что в один времени выполняется только одно действие. Даже если в фоне в одном процессе NodeJS/Javascript запущены 10 promise, они работают по очереди.
Может быть твоя проблема как-то связана с этим.А может быть, наоборот, у тебя слишком много процессов и сама Ось постоянно переключает контексты между ними, что дает падение производительности/вычислений. Этот вариант маловероятен, так как обычно это приводит к полной загрузке CPU.
-
@sergerdn Это получается, по сути, 10 БАС окон. так нагрузка возрастает в разы. Я запускаю не компил а XML. Иногда мне кажется что он начинает брать ходы как с соседнего потока.. особенно если пытаешься относительно малое время ставить между запросом решения хода типу 2секудны и чем дольше пауза тем лучше, но возможно, я просто себя уже накрутил на эту мысль.
По поводу меток, да я их использую но не часто, в основном только при обработке ошибок чтобы перемещается в начало или конец, в зависимости от нужды. Основная логика в циклах.
-
@hvrsh said in Бас Шалит в Многопотке:
@sergerdn Это получается, по сути, 10 БАС окон. так нагрузка возрастает в разы.
Да, 10 окон. Если сильно возрастает нагрузка - это может значить, что моя гипотеза об однопоточности верна, так как в одной копии скрипта условно код ждет своей очереди на выполнение. А при множестве копий - равномерно распределяется по ядрам CPU и нагрузка возрастает, потому что в один момент времени выполняется больше инструкций, так как разные ядра CPU.
-
@rkk9 said in Бас Шалит в Многопотке:
@sergerdn ох уж этот node js
Запущенные скрипты из разных директорий работают каждый со своим инстансом nodejs, так что это честно может увеличить скорость работы при частом использовании ноды.
-
@biohacker01 said in Бас Шалит в Многопотке:
@Fox Можно добиться такого же, не разможная на много папок все ?.
Как то запускать изолированные инстатны с каждым своим nodejs ?Нет
-
@biohacker01 можно запускать worker treads в nodejs https://nodejs.org/dist/latest-v18.x/docs/api/worker_threads.html
-
@rkk9 said in Бас Шалит в Многопотке:
@sergerdn ох уж этот node js
Со своими нюансами, как и многие другие инструменты. На сервере я обычно ставлю спереди nginx, сзади него по кол-ву ядер CPU инстансы приложения. Неважно на чем оно написано, что python, что NodeJS.
Это обычная практика.
-
@UserTrue said in Бас Шалит в Многопотке:
@biohacker01 можно запускать worker treads в nodejs https://nodejs.org/dist/latest-v18.x/docs/api/worker_threads.html
Интересно, как это все дело синхронизуется, чтобы не было race condition:
Unlike child_process or cluster, worker_threads can share memory. -
@UserTrue said in Бас Шалит в Многопотке:
@sergerdn не обязательно же использовать общую память.
Если не обязательно, то можно использовать _ child_process_, как самое простое в реализации(наверное). Стартовал поток в BAS, к нему стартовал child_process, закончил поток работу - child_process тоже закончил.
Это будет не самый хороший вариант, так как будет нагрузка на CPU в момент старта потока, но для начала можно сделать и так. К тому же это даст хорошую изоляцию как между разными потоками, что работают в один времени, так и в момент старта нового потока, так как он получит свежий child_process.
А потом уже можно сделать и shared worker pull и другие всякие "модные" вещи.
Наверное, это надо делать на стороне BAS самим разработчиком.
-
@sergerdn said in Бас Шалит в Многопотке:
сли не обязательно, то можно использовать _ child_process_, как самое простое в реализации(наверное). Стартовал поток в BAS, к нему стартовал child_process, закончил поток работу - child_process тоже закончил.
Я как бы знаю что и как использовать,или это мысли в слух? ))
-
@UserTrue said in Бас Шалит в Многопотке:
Я как бы знаю что и как использовать,или это мысли в слух? ))
Ключевое:
@sergerdn said in Бас Шалит в Многопотке:
Наверное, это надо делать на стороне BAS самим разработчиком.
И, так как я не специалист в NodeJs, вероятно, могу сильно ошибаться и ты можешь написать мне: все это фигня, оно работает не так, как ты думаешь.
И я видел в этой теме Fox(специально не тегаю его, он ругается иногда). Это в том числе для него мысли.
-
@sergerdn said in Бас Шалит в Многопотке:
И, так как я не специалист в NodeJs, вероятно, могу сильно ошибаться и ты можешь написать мне: все это фигня, оно работает не так, как ты думаешь.
Один из вариантов работы с тредами https://github.com/metarhia/noroutine
