@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
Условие для завершения Вызванной "функции в несколько потоков"
-
Помню где то на форуме встречал подобную проблему, но блин, найти не сумел.
Как можно логикой скрипта завершить вызов многопоточной функции?У меня в тестовом скрипте запускается функция в 10 потоков, и мне нужна логика, чтобы как только любой из потоков выполнил условие, вся функция тут же завершилась. Без ожидания всех остальных потоков.
Функция стоит на 1 удачное выполнение и 1 неудачное.Если проект запустить и в файле
C:\test\test.txtпоставить 1 вместо 0, то выполнится условие у потока. Он завершится и всё, дальше скрипт будет ждать завершения всех потоков.Пробовал через Break, Success, Fail, Прервать Скрипт (завершить скрипт мгновенно). Ни чего не срабатывает. Можно конечно через глобальную переменную смотреть, выполнился ли хоть один поток.. Но по моему это костыль.
Ещё заметил, что экшены Success, Fail, Прервать Скрипт хоть и завершают поток, но не пишут в лог записанное в них сообщение.
-
@Fox said in Условие для завершения Вызванной "функции в несколько потоков":
Можно конечно через глобальную переменную смотреть, выполнился ли хоть один поток.. Но по моему это костыль.
Почему же костыль. Вполне нормальное решение - проверять значение глобальной переменной перед стартом каждой итерации каждого потока и не возобновлять его, если условие не выполнилось. Особенно при отсутствии родного функционала такого назначения.
Ещё просится записывать максимальное число в переменную количества успехов или неудач. Но не факт, что в скрипте будет доступ к таким переменным. -
@xclsv Я пробовал с глобальной переменной. В моём тестовом скрипте потоки спят периодически, и пока они все прочтут глобальную переменную, проходит прилично времени. Как вариант конечно вставлять проверку через каждый экшен..
Да и почему "Прервать Скрипт (завершить скрипт мгновенно)" не прерывает вызванную функцию? По идее же должен закрыть все потоки.
-
@support said in Условие для завершения Вызванной "функции в несколько потоков":
Прервать Скрипт (завершить скрипт мгновенно) сейчас ждет завершение всех потоков. Я допилю, чтобы галка "завершить скрипт мгновенно" работала внутри многопоточной функции.
было бы супер, тоже жду :)
UPD: ой, такая галка уже есть, пардон, не заметил. Она просто мгновенно завершает выполнение скрипта в вызванном потоке, но поток(браузер) не закрывается?@Fox said in Условие для завершения Вызванной "функции в несколько потоков":
Ещё заметил, что экшены Success, Fail, Прервать Скрипт хоть и завершают поток, но не пишут в лог записанное в них сообщение.
любые ошибки в многопоточной функции остаются только где-то там, в ее недрах :) в общий лог не попадают. Я уже поднимал темку, автор обещал пофиксить. т.е. "запустить функцию в N потоков" != "запустить проект в N потоков", логика там где-то видимо отличается.