@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
Уникальное рандомное число в многопотоке.
-
@Fox Самый простой способ - устанавливаете очень большое число для параметра Максимальное Значение. 2147483647
Таким образом, вероятность совпадения будет маленькая.
Если есть уверенность, что каждый поток будет брать не больше чем n чисел, то можно такrand(1, n) + thread_number() * nЕсли нужна 100% уверенность, что числа не будут повторятся, то можно в OnApplicationStart создать список 1,2,3,4, ... перемешать его соответствующим действием и записать в ресурс, потом в основных потоках использовать этот ресурс.
-
@support said in Уникальное рандомное число в многопотоке.:
Если нужна 100% уверенность, что числа не будут повторятся, то можно в OnApplicationStart создать список 1,2,3,4, ... перемешать его соответствующим действием и записать в ресурс, потом в основных потоках использовать этот ресурс.
Думаю так и сделать. Получается каждый ресурс будет брать своё значение и оно будет удалятся из списка. А если мне понадобится снова полный список, скажем через пол часа?
Reload('ИМЯ РЕСУРСА')Поможет команда?
-
Попробовал я создать список, перемешать его и добавить в ресурс. В итоге, из ресурса переменная берёт все значения сразу. Решил добавлять значения в ресурс по одному, в цикле. Всё работает, только вот пермешать цифры в ресурсе не выходит, плюс обновить ресурс командой
Reload('ИМЯ РЕСУРСА')тоже не получается.
Вот тестовый проект -
Блин, команда обновляет ресурс в пустой.. Видимо.
-
Попробовал сделать через файл, создать список, перемешать его, сохранить в файл. Ресурс из файла работает. Но каждый раз после обновления Reload('ИМЯ РЕСУРСА'), данные идут в том же порядке, так как в файле, что логично, ведь они так и записаны. Плюс в многопотоке, в разное время, разные потоки будут использовать команду Reload('ИМЯ РЕСУРСА'), а значит, что может получится несколько подряд первых чисел в списке.
Задача вроде простая, есть диапазон чисел, к примеру, от 1 до 10. Пять потоков берут уникальное, рандомное число и пишут в лог. После определённого условия, список обновляется и потоки уже берут другие случайные цифры, можно и такие же как в первый раз. Но не всегда одни и те же.
Вариант с ресурсом из файла -
О! Есть же галочка в ресурсе "Мешать строки" !
-
Один фиг, обновляешь ресурс, а он не перемешивает по новой строки, выходит что он каждый раз, будет одни и те же цифры давать тем же потокам.
-
Спасибо. Я как то и не подумал, что в список можно индекс цикла записывать. Решение интересное, но мою проблему не решит.
При открытии скрипта в функции OnApplicationStart создаётся ресурс random, после первого использования если я восстановлю его командой Reload('random'), то те же потоки, возьмут те же числа.
Вот например. -
@support Я в первом сообщении темы не полностью развернул суть проблемы. Дело в том, что скрипт работает неделями без остановок. А случайные числа используются раз 10 в день. Основная проблема именно в повторном использовании ресурса.
Была бы команда перемешать по новой строки в ресурсе.. -
Дело в том, что скрипт работает неделями без остановок. А случайные числа используются раз 10 в день.
Все равно не очень понимаю почему мой вариант не подходит, там генерируется 10000 чисел, при использовании по 10 день хватит очень надолго.
Была бы команда перемешать по новой строки в ресурсе..
Есть команда RPickRandom(name, size) возможно она поможет