|
Многопоточная обработка с применением БСП | ☑ | ||
---|---|---|---|---|
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
|
Вроде бы нашел:
ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |