Многопоточная обработка с применением БСП
☑
0
Franchiser
гуру
28.10.18
✎
09:26
Как выполнить многопоточная обработку с использованием процедур БСП из внешней обработки, не добавляя свою процедуру из обработки для длительного выполнения в общий модуль. Нашел примеры как выполнять прогресс с БСП из внешней обработки, а примеров по многопоточности нет.
1
Dmitry1c
28.10.18
✎
09:39
А твоя задача вообще распараллеливаемая?
2
Franchiser
гуру
28.10.18
✎
09:40
Пример:
&НаСервере
Процедура ОбновитьЦену()
ВремяНачала = ТекущаяДата();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Ссылка
|ИЗ
| Справочник.Товары КАК Товары";
ТаблицаТоваров = Запрос.Выполнить().Выгрузить();
// определяем максимальное количество потоков
ЧислоПотоков = 8;
ЧислоСтрокВТаблице = ТаблицаТоваров.Количество();
// объем порции данных для обработки каждым потоком
РазмерПорции = Цел(ЧислоСтрокаВТаблице/ЧислоПотоков);
// массив, где будут храниться фоновые задания
МассивЗаданий = НовыйМассив;
Для НомерПотока = 1 По ЧислоПотоков Цикл
// определяем индекс для начала обработки данных данным потоком
// разные потоки обрабатывают разные части таблицы
ИндексНачала = (НомерПотока - 1)*РазмерПорции;
Если (НомерПотока = ЧислоПотоков) Тогда
// если это последний поток, то он обрабатывает все оставшиеся данные
// т.к. число потоков может не быть кратно количеству строк в таблице
РазмерПорции = ЧислоСтрокВТаблице -(ЧислоПотоков*РазмерПорции)+РазмерПорции;
КонецЕсли;
// определяем массив параметров для процедуры
НаборПараметров = Новый Массив;
НаборПараметров.Добавить(ТаблицаТоваров);
НаборПараметров.Добавить(ИндексНачала);
НаборПараметров.Добавить(РазмерПорции);
// запуск фонового задания
Задание = ФоновыеЗадания.Выполнить("ОбщийМодуль1.ОбновитьЦенуТовара", НаборПараметров);
// добавляем задание в массив, чтобы потом отследить выполнение
МассивЗаданий.Добавить(Задание);
КонецЦикла;
// проверим результат выполнения фоновых заданий
Если МассивЗаданий.Количество() > 0 Тогда
Попытка
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
Исключение
// действия в случае ошибки
КонецПопытки;
КонецЕсли;
Длительность = ТекущаяДата()-ВремяНачала;
Сообщить("Длительность: " + Длительность + "сек.");
КонецПроцедуры
Процедура ОбновитьЦенуТовара (ТаблицаТоваров,ИндексНачала,РазмерПорции) Экспорт
Наценка = 1.10; // наценка 10%
// обновляем цену только для определенной части таблицы
Для Сч = 1 По РазмерПорцииЦикл
Индекс = ?(Сч=1,ИндексНачала,Индекс+1);
ТоварОбъект = ТаблицаТоваров[Индекс].Ссылка.ПолучитьОбъект();
ТоварОбъект.Цена = ТоварОбъект.Цена * Наценка;
ТоварОбъект.Записать();
КонецЦикла;
КонецПроцедуры
3
Franchiser
гуру
28.10.18
✎
09:43
Как можно заменить
"ОбщийМодуль1.ОбновитьЦенуТовара" на процедуру из БСП, чтобы выполнить ОбновитьЦенуТовара из модуля формы или модуля объекта текущей внешней обработки. Внешняя обработка м.б. как временной в справочник внешних обработок, так и выбрана через файл-открыть.
4
Franchiser
гуру
28.10.18
✎
09:44
(1) да
5
Franchiser
гуру
28.10.18
✎
10:17
Вроде бы нашел:
ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший