Получение пользователей в многопотоке

1. Gendelf 14.06.24 11:25 Сейчас в теме
Добрый день, подскажите пожалуйста можно ли выполнить в многопотоке получение данных пользователей?
Например есть несколько тысяч пользователей ИБ, по которым нужно получить расширенные данные и вернуть в http-сервис.

Идея заключается в параллельном заполнении массив Результат фоновыми заданиями, но это не работает. Результат так остаётся пустым, процедура в общем модуле его заполняет, но не возвращает заполненный массив.

PS делал по примеру с курсы-по-1с

Подскажите пожалуйста, возможно где ошибся или идея в корне не верная?


Код в сервисе:

Для НомерПотока = 1 По ЧислоПотоков Цикл
		
		ИндексНачала = (НомерПотока - 1) * РазмерПорции;
		
		Если НомерПотока = ЧислоПотоков Тогда
						
			РазмерПорции = ЧислоСтрокВТаблице-(ЧислоПотоков*РазмерПорции)+РазмерПорции;
			
		КонецЕсли;
		
		НаборПараметров = Новый Массив;
		НаборПараметров.Добавить(МассивПользователейИБ);
		НаборПараметров.Добавить(ИндексНачала);
		НаборПараметров.Добавить(РазмерПорции);
		НаборПараметров.Добавить(Результат);
		
		Задание = ФоновыеЗадания.Выполнить("MultithReading.ПолучитьПользователейМногопоточный", НаборПараметров);
		
		МассивЗаданий.Добавить(Задание);
		
КонецЦикла; 
	
Если МассивЗаданий.Количество() > 0 Тогда

        Попытка
            ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
        Исключение

        КонецПопытки;

КонецЕсли;
Показать



В общем модуле:
Процедура ПолучитьПользователейМногопоточный(МассивПользователейИБ, ИндексНачала, РазмерПорции, Результат) Экспорт
	
	Для Сч = 1 По РазмерПорции Цикл
		
		Индекс = ?(Сч=1, ИндексНачала, Индекс+1);
		
		ПользовательИБ = МассивПользователейИБ[Индекс];
		
		Результат.Добавить(ПолучитьПолныеДанныеПользователя(ПользовательИБ));
		
	КонецЦикла;
	
КонецПроцедуры 
Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. spacecraft 22.06.24 13:55 Сейчас в теме
(1) https://its.1c.ru/db/v8std/content/642/hdoc
Там пример есть. Для выполнения не в несколько потоках, но механизм не сильно отличаться будет.
2. booksfill 14.06.24 17:05 Сейчас в теме
Через параметр "Результат" ничего не получите, т.к. эта переменная будет существовать только в контексте процесса фонового задания.
Посмотрите в любой конфигурации, где есть БСП и ОМ.ДлительныеОперации - там все делается через временное хранилище. Там все понятно.

или идея в корне не верная

Вы бы хоть озвучили, что за расширенные данные такие, а то есть подозрение, что при получении неких расширенных данных вы делаете что-то плохое, типа неявного запроса в цикле - лезете в базу для каждого пользователя отдельно, а если отдаете все это по http то в базу 100% лезете, хотя бы для превращения ссылок в строки.
Поэтому и возникла вообще идея разбить все это по фоновым заданиям.
3. Serg2000mr 417 21.06.24 14:40 Сейчас в теме
(1) Смотрите функцию ДлительныеОперации.ВыполнитьФункциюВНесколькоПотоков
4. starik-2005 3053 21.06.24 17:30 Сейчас в теме
1. Результат - это в каждом потоке своя переменная.
2. Чтобы было по красоте, надо результат поместить во временное хранилище, а адрес передать вызывающему потоку через "Сообщить(Адрес/Результата)".
3. После завершения потока получить из временного хранилища данные результата и добавить в общий результат.
4. После завершения всех потоков общий результат вернуть вызывающему приложению.
5. Serg2000mr 417 22.06.24 03:24 Сейчас в теме
(4) Это вариант для конфигураций без БСП?
6. ImHunter 318 22.06.24 13:34 Сейчас в теме
(4) Гм. Интересно. Немного меняет "платформенный" подход, когда адрес хран результата изначально из родительского потока передается. Видимо, да, нужно было еще "между строк" прочитать про технику использования платформенного подхода и сделать свои выводы.
Но, имхо, особо ничего такой измененный подход не дает, кроме вопросов "а зачем так необычно".
Вероятно, основная "фишка" измененного подхода в том, что из ФЗ можно получать результаты постепенно, пачками, а не дожидаться окончания всего задания и всего объема результатов.
8. Serg2000mr 417 22.06.24 14:25 Сейчас в теме
(6) В БСП постепенная передача результатов предполагается через ДлительныеОперации.СообщитьПрогресс() и ДлительныеОперации.ПолучитьПрогресс()
9. ImHunter 318 22.06.24 14:40 Сейчас в теме
(8) Ну понятно... Сахар для Сообщить/ПолучитьСообщения.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот