@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
Несколько get-запросов в одном коде
-
В коде никак не могу прописать сразу несколько запросов через http-клиент одновременно. Беда с этими асинхронными функциями...
Скрипт будет однопоточный, так что функционал таков, что делать запросы можно, однако ж всё равно проходит только первый. Второй выполняется и скрипт вылетает. Что в одном блоке кода, что если разнести по разным блокам.
Мои действия:
Вызов первый:switch_http_client_main() http_client_get2('https://vk.com/select_ajax.php?act=a_get_countries',{method:("GET"),headers:("")})! VAR_SAVED_CONTENT = http_client_encoded_content("auto")Вызов второй чуть ниже:
_switch_http_client_main() http_client_get2('https://vk.com/select_ajax.php?act=a_get_cities&country='+country+'&str=$$$***',{method:("GET"),headers:("")})! var content = http_client_encoded_content("auto")После второго вызова приходит правильный ответ, что видно по анализатору http-траффика, но весь скрипт падает, никакие отладки не помогают - скрипт крашится ещё до того, как успеваю глянуть в [[LAST_ERROR]].
Пробовал оборачивать асинхронные действия в конструкцию типа
_if(true, function(){ _call(Вызов http и get-запрос)! })!Но такая конструкция не верна, так как ничего не возвращает.
Куда копать? Кому удалось запустить в исходном коде запросы?
-
_if(true, function(){ http_client_get2(....)! })! -
@uraabk да, переписал код, и у меня заработало. Оказывается, проблема была не в вызовах, а совсем в другой части кода. Ругался на то, что я делаю вызво в цикле с условием if:
var country_search = asf.res("country") if (country_search == "Search by cityes"){ _if(true, function(){ _switch_http_client_main() http_client_get2('https://vk.com/select_ajax.php?act=a_get_cities&country='+country_id+'&str=$$$***',{method:("GET"),headers:("")})! VAR_CITYES = http_client_encoded_content("auto") })! }Вытащил вызов за пределы цикла - вуаля, всё работает.
Кто-нибудь знает почему так?
-
@pragmatik Я Вам даже скажу, что и этот Ваш код неверный
да, переписал код, и у меня заработало. Оказывается, проблема была не в вызовах, а совсем в другой части кода. Ругался на то, что я делаю вызво в цикле с условием if:
var country_search = asf.res("country") if (country_search == "Search by cityes"){ _if(true, function(){ _switch_http_client_main() http_client_get2('https://vk.com/select_ajax.php?act=a_get_cities&country='+country_id+'&str=$$$***',{method:("GET"),headers:("")})! VAR_CITYES = http_client_encoded_content("auto") })! }Вытащил вызов за пределы цикла - вуаля, всё работает.
Кто-нибудь знает почему так?
в простом if нельзя вызывать асинхронную функцию БАС
-
@pragmatik Проще наверное ответить "потому что" ))) Просто даже если писать на чистом js, то результат будет такой же, чтобы работать с асинхронными вызовами там и существуют калбеки, промисы, генераторы и наконец await/async. В бас же реализован свой api с которым и надо работать, тк этого его внутренние функции и использовать с ними например промисы не получится.
