@Fox Привет.Я описывал задачу в этой теме https://community.bablosoft.com/topic/27417/вызов-многопоточной-функции
Дело в том,что я не могу вообще никак перевести свой скрипт на многопоток,у меня тупо,что в вызове функции в многопоток,что просто обычный многопоток,выполняет свою работу с данными по очереди,а не одновременно.И это очень сильно бьет по времени,а нужна именно скорость обработки.Все уже готово и скрипт рабочий полностью,но скорость обработки заставила воспользоваться многопотоком.Ранее,подобных проблем не замечал,а сейчас элементарную задачу не могу уже несколько дней решить.
Скрипт очень простой и работает без браузера вообще,в скрипте используется только одно взаимодействие с гет запросом.Пример скрипта я приложил в этой теме(но без запросов),он точно почти такой же,как и основа.
Логика такова:
1)Запускается скрипт (без всяких ресурсов изначально и данных) и создаются два ресурса.
2)Делается запрос на сайт,который обрабатывается в отдельной функции,т.е. обрабатывает полученные строки и записывает в ресурс.
3)Вызывается функция в несколько потоков,которая работает (должна работать) с каждой строкой из созданного ранее ресурса(уникальной)в отдельном потоке.Данные обрабатываются и записываются во второй ранее созданный ресурс.
4)Как только данные обработаны,ресурс переводится в список и список записывается в файл.Более ничего не делается.
-Сперва я думал,что проблема в создаваемых в ходе работы ресурсах,но нет.Создавал изначально ресурсы и то же самое было.
-Потом пробовал брать из файлов значения\потом создавать файлы по ходу и из них брать данные\сохранять напрямую пытался и.т.д
-Возможно думал стоят какие то ограничения из за слабого пк с 4 гб оперативы и взял сервер с 64 гб,но как обрабатывалась строка за 5 минут на моем пк,так же по скорости и на серваке.Ладно, с этим я уже ничего не поделаю из за регулярок в проекте,согласен.Но вот перевести на поток и хотя бы по 10 строк одновременно обрабатывать,очень бы помогло.А сейчас в любом случае,у меня,сколько бы потоков не выставил - работает все равно как один,просто по очереди разный поток берет свои данные(
Уникальное рандомное число в многопотоке.
-
Скрипт работает в 20 потоков и использует функцию "случайное число", но иногда числа дублируются. Чтобы этого избежать, думаю можно реализовать через глобальные переменные, чтобы один поток генерировал случайные числа и раздавал остальным.. Хотя интуиция подсказывает, что проще это сделать через ресурс. Как ресурс из файла, со строками, после использования которых, удаляют.. Но файл тогда каждый раз придётся восстанавливать.
Подскажите, как можно реализовать использование уникального случайного числа в многопотоке? -
@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) возможно она поможет