Closed leshchenko1979 closed 3 years ago
Если такая паджинация действительно в разы быстрее, то:
run
параллельно создателя задач и воркера. srh.max_concurrent_requests
). Выполнение будет происходить через wait_for
, перемежаясь с опросом очереди задач на предмет появления новых задач и добавления их в набор выполняемых задач, если этот набор не заполнен до конца.start
, а другой - с двумя потоками запросов со start = -1
(с начала списка и с конца), базирующимися на паджинации через фильтр по ID
.ID
будет подразумевать в создателе задач в каждом потоке (с начала и с конца) ожидание события о том, что очередной результат от сервера получен, нахождение крайнего значения ID
в нем и формирование новой задачи на базе этого значения ID
. Когда потоки встречаются (крайний ID потока сначала становится больше крайнего ID потока с конца), генерация задач прекращается.ID_pagination
конструктору. См. результаты теста: https://github.com/leshchenko1979/fast_bitrix24/discussions/113
В итоге все закончилось созданием метода list_and_get()
: #118
Текущая стратегия выборки в
get_all()
с использованием параметраstart
, хотя и позволяет использовать параллелизм, но замедляет работу сервера. Ее применение может быть неоптимальным при условиях: 1) требуется сложная фильтрация с выгрузкой небольшого количества записей 2) полный список сущностей (без фильтров) содержит большое количество записейДля таких случаев более оптимальной может быть стратегия, описанная тут: https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php
Можно дать пользователю в
get_all()
параметрstrategy
, который он будет использовать, чтобы выбрать стратегию. Либо можно после первого вызова в зависимости от размера параметраfilter
вparams
и отtotal
, возвращаемого в первом ответе, выбирать стратегию автоматически. Алгоритм выбора стратегии можно подобрать опытным путем.