Добрый день, подскажите пожалуйста можно ли выполнить в многопотоке получение данных пользователей?
Например есть несколько тысяч пользователей ИБ, по которым нужно получить расширенные данные и вернуть в http-сервис.
Идея заключается в параллельном заполнении массив Результат фоновыми заданиями, но это не работает. Результат так остаётся пустым, процедура в общем модуле его заполняет, но не возвращает заполненный массив.
PS делал по примеру с курсы-по-1с
Подскажите пожалуйста, возможно где ошибся или идея в корне не верная?
Код в сервисе:
Для НомерПотока = 1 По ЧислоПотоков Цикл
ИндексНачала = (НомерПотока - 1) * РазмерПорции;
Если НомерПотока = ЧислоПотоков Тогда
РазмерПорции = ЧислоСтрокВТаблице-(ЧислоПотоков*РазмерПорции)+РазмерПорции;
КонецЕсли;
НаборПараметров = Новый Массив;
НаборПараметров.Добавить(МассивПользователейИБ);
НаборПараметров.Добавить(ИндексНачала);
НаборПараметров.Добавить(РазмерПорции);
НаборПараметров.Добавить(Результат);
Задание = ФоновыеЗадания.Выполнить("MultithReading.ПолучитьПользователейМногопоточный", НаборПараметров);
МассивЗаданий.Добавить(Задание);
КонецЦикла;
Если МассивЗаданий.Количество() > 0 Тогда
Попытка
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
Исключение
КонецПопытки;
КонецЕсли;
Показать
В общем модуле:
Процедура ПолучитьПользователейМногопоточный(МассивПользователейИБ, ИндексНачала, РазмерПорции, Результат) Экспорт
Для Сч = 1 По РазмерПорции Цикл
Индекс = ?(Сч=1, ИндексНачала, Индекс+1);
ПользовательИБ = МассивПользователейИБ[Индекс];
Результат.Добавить(ПолучитьПолныеДанныеПользователя(ПользовательИБ));
КонецЦикла;
КонецПроцедуры
(2) Спасибо за верные наводки.
Ошибка была в том, что реализация проходила в файловой версии БД, и фоновые задания выполнялись оч долго или зависали. И результат нужно было поместить во временное хранилище, который заранее определялся в http-сервисе, потом остается пройтись по адресам и собрать данные.
Через параметр "Результат" ничего не получите, т.к. эта переменная будет существовать только в контексте процесса фонового задания.
Посмотрите в любой конфигурации, где есть БСП и ОМ.ДлительныеОперации - там все делается через временное хранилище. Там все понятно.
или идея в корне не верная
Вы бы хоть озвучили, что за расширенные данные такие, а то есть подозрение, что при получении неких расширенных данных вы делаете что-то плохое, типа неявного запроса в цикле - лезете в базу для каждого пользователя отдельно, а если отдаете все это по http то в базу 100% лезете, хотя бы для превращения ссылок в строки.
Поэтому и возникла вообще идея разбить все это по фоновым заданиям.
(2) Спасибо за верные наводки.
Ошибка была в том, что реализация проходила в файловой версии БД, и фоновые задания выполнялись оч долго или зависали. И результат нужно было поместить во временное хранилище, который заранее определялся в http-сервисе, потом остается пройтись по адресам и собрать данные.
1. Результат - это в каждом потоке своя переменная.
2. Чтобы было по красоте, надо результат поместить во временное хранилище, а адрес передать вызывающему потоку через "Сообщить(Адрес/Результата)".
3. После завершения потока получить из временного хранилища данные результата и добавить в общий результат.
4. После завершения всех потоков общий результат вернуть вызывающему приложению.
(4) Гм. Интересно. Немного меняет "платформенный" подход, когда адрес хран результата изначально из родительского потока передается. Видимо, да, нужно было еще "между строк" прочитать про технику использования платформенного подхода и сделать свои выводы.
Но, имхо, особо ничего такой измененный подход не дает, кроме вопросов "а зачем так необычно".
Вероятно, основная "фишка" измененного подхода в том, что из ФЗ можно получать результаты постепенно, пачками, а не дожидаться окончания всего задания и всего объема результатов.