Бесконечный перебор БД



  • Здравствуйте! Хочу сделать бесконечный перебор БД, пока руками не остановлю проект. Если парсить строку из бд и убрать галочку "повторное использование", а в конце работы вернуться к метке, установленной перед парсингом, то да, будет браться следующая строчка. Но когда закончатся строки, поток закрывается с сообщением что все строки ресурса обработаны, даже если установить повторы на "повторять".
    Попробовал вариант когда после возврата к метке обновляется ресурс. Возникла другая проблема: при первом повторном парсинге из бд удаляется последняя строчка и при каждом новом проходе становится на одну строчку меньше. Память о последней взятой строчке сохраняется, а не обнуляется.
    Думал над вариантом с foreach, но т.к. скрипт будет работать в многопотоке, этот вариант тоже отпадает. Пробовал запустить функцию в многопотоке внутри форейч, но нужно объявлять глобальную переменную, а при парсинге в список нельзя указать созданную глобальную, да и переменная форейч_дата объявляется самим форейч и объявить ее глобальной ни как не получится.
    Может подскажет кто, как еще можно сделать возврат в начало бд?



  • @DraikKin не добавляй БД в ресурс. Делай через While -True, Получить запись по критерию, в цикле можеш перебрать каждий номер страницы (цикл FOR от 1 до "количество записей") (розмер страницы 1)



  • Для того чтобы в "получить запись по критерию" бралась следующая строчка в начале скрипта ввел переменную n=1, которая в цикле for подставляется поле "кол-во записей", а в конце цикла for увеличивается на 1. Тем самым при каждой интерации берется следующая строчка и так до тех пор, пока не переберется весь список.
    Работает правильно, но в одном потоке, если включить хотя бы 2 потока, то получается что оба потока берут одну и ту же строчку, т.к. меняют n. Если бы каждый поток брал следующую цифру)



  • добав в базе поле - резерв, если взял с бази став пометку в етом поле, тогда Получить запись по критерию - без пометки.



  • А разница? Каждый поток выполнит данное действие и сформирует одинаковый список без пометок, и будет брать одинаковые данные. Ведь формируется список, а чтобы получить из списка строчку применяю "парсить строку" и каждый поток запишет первое одинаковое значение. При этом перейти к следующему, как я понял, можно только с форейч, т.к. галочка "повторное использование" есть только у ресурсов, а не у переменных



  • Я не понимаю в чем проблема делать резервирование строки при взятии и обнулять рещерв по выполнении проставляя в колонку выполнено "1"



  • @kuzkuz А потом мне переставлять на 2 и т.д.? Я же говорю, скрипт Должен крутиться без остановки! Он пройдет всю бд, на втором круге список все тот же, но в твоей колонке будет стоять 1, а значит чтобы на след. круге он взял строки, содержащие эту колонку, нужно дополнительно ввести переменную и в конце делать интерацию на 1. Если я правильно тебя понял, конечно.



  • @DraikKin said in Бесконечный перебор БД:

    @kuzkuz А потом мне переставлять на 2 и т.д.? Я же говорю, скрипт Должен крутиться без остановки! Он пройдет всю бд, на втором круге список все тот же, но в твоей колонке будет стоять 1, а значит чтобы на след. круге он взял строки, содержащие эту колонку, нужно дополнительно ввести переменную и в конце делать интерацию на 1. Если я правильно тебя понял, конечно.

    Бери данные в цикле, сперва с 0, потом с 1, потом с 2 в той колонке.
    Получи значение, прибавь и перезапиши
    Все просто
    если с значение 0 результатов нет переходим к 1 и т.д



  • В любом случае провел эксперимент, первым действием сделал перезагрузить список, вторым вызвал функцию в многопотоке, в которой прописал "парсить строку из ресурса, убрав галочку "использовать повторно". В итоге когда вызывается функция каждый поток парсит следующую строку, работает с ней, а т.к. каждый поток похоже резервирует свою строку, то первый освободившийся поток берет следующую и так пока не кончится список в ресурсе. А т.к. данный ресурс был вызван внутри функции, внешняя функция не видит изменений в ресурсе и при типе запуска "повторять" он обрабатывается постоянно.
    Первое же действие "перезагружать список" позволяет работать с обновленной бд и вызываемая функция будет всегда получать обновленные данные.



  • @kuzkuz Так может дойти и до 9999999999999 )))
    Выше написал вариант проще. Но поймал сейчас на мысли, если при обновлении бд не останется строк, то скрипт закроется ведь) Надо попробовать зациклить переходом к метке



  • @DraikKin said in Бесконечный перебор БД:

    @kuzkuz Так может дойти и до 9999999999999 )))
    Выше написал вариант проще. Но поймал сейчас на мысли, если при обновлении бд не останется строк, то скрипт закроется ведь) Надо попробовать зациклить переходом к метке
    .

    Как так? Прерывайте цикл и все...



  • @kuzkuz Не надо ничего прерывать, проверил. Даже если база пуста, скрипт не останавливается.



  • @DraikKin Если я вас правильно понял, то ваша задача решается стандартными настройками ресурса, просто поставьте число успехов и неудач для ресурса побольше и еще можно поставить галочку обновлять, тогда счетчики успехов и неудач будут скидываться и ресурс точно никогда не закончится
    2020-07-21_200455.png



  • @UserTrue Коряво, но подойдет для статической таблицы. Коряво потому что нужно высчитывать за какое время обрабатывается вся таблица и такое время нужно задать в обновлении. Все потому, что при парсинге строк из ресурса убираются строки и если обновление происходит быстрее, чем пройдены все строки ресурс восстанавливается и скрипт не успевает дойти до последних строк, как начинает все заново. А с обновляемой таблицей так вообще не вариант, т.к. неизвестно через какое время появятся новые строки и сколько их вообще будет и какое время понадобится на обработку.
    Описанный выше вариант подходит полностью. По крайне мере на начальном этапе, а там с подключением проксей, обновлении таблиц и еще кое каких данных, видно будет)
    Может, конечно, на том же питоне все это удобней было бы, но я освоил только чтение/запись в файл, запросы и обработку json. Многопоток, обработчик ошибок, сколько не читал, так ничего и не понял)



  • @DraikKin Я если честно мало вас понял, но если вы нашли решения то ок


Log in to reply
 

  • 2
  • 5
  • 1
  • 13
  • 2
  • 4
  • 12
  • 6