|
|
|
Помогите распараллелить процедуру программистище, lEvGl, orakool, Михаил_, Mulber, Ногаминебить, AlexKimp, Garykom, RVN, mr_K, MishaSan, Бычье сердце, Злопчинский, Шурик71, maxar, kubik_live, Галахад, Андрюха, youalex, kir-g, Arh01, Djelf, Kigo_Kigo, banco, LevelUP, СделатьВсеХорошо, Lazy Stranger, formista2000, oleg_km, lucky_, Bigbro, Gucci76, ldo6, Timon1405, vyaz, dmt, GreyK, 2mugik, Zamestas, Irbis, Chameleon1980, qsunnx, Мультук, shuhard, piter3, maxab72, trad, Trinitron, Vstur, АгентБезопаснойНацио, Ненавижу 1С, Builder, Хряк, obs191, Волшебник, bmitkin, H A D G E H O G s, craxx, Anton1307, Крэкпэк, Redkiy, sikuda, Михаил Козлов, lubitelxml, yurikmellon2, Rovan, mishaPH, AlvlSpb, crotnn, Gun47, Has, arsik, Масянька, Crusher, Kongo2019, d4rkmesa, Linemoon, 2S, Fedor-1971, privetik, alexela, nick86, Hawk_1c, boev82, Amfiaray, Beduin, Александр111, zenik, Prog_man, p-soft
| ☑ | ||
|---|---|---|---|---|
|
0
Mulber
18.04.25
✎
10:05
|
Доброго всем дня. Нуждаюсь в помощи по распараллеливанию процедуры по 4 фоновых задания (по поставщикам, 4 разом из СписокПоставщиков).Сейчас в цикле последовательно данные получаю: &НаСервере
ЗагрузитьЦеныПоставщиковЭкспПроцедура ЗагрузитьЦеныПоставщиковЭксп(Список, ДанныеПоставщика, ПакетнаяОбработка = Ложь) Экспорт
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "N");
ТЗ.Колонки.Добавить("MPN", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN");
ТЗ.Колонки.Добавить("MPNAPI", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN API");
ТЗ.Колонки.Добавить("КоличествоВЗаказе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Количество в заказе");
ТЗ.Колонки.Добавить("ПроизводительВЗаказе", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель в заказе");
ТЗ.Колонки.Добавить("Производитель", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель");
ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Цена");
ТЗ.Колонки.Добавить("Валюта", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(10)), "Валюта");
ТЗ.Колонки.Добавить("МинКоличествоЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Мин количество заказа");
ТЗ.Колонки.Добавить("КоличествоВУпаковке", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Количество в упаковке");
ТЗ.Колонки.Добавить("НаличиеНаСкладе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Наличие на складе");
ТЗ.Колонки.Добавить("СрокПоставки", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Срок поставки");
ТЗ.Колонки.Добавить("СуммаЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Сумма заказа");
ТЗ.Колонки.Добавить("ВесПозиции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 3)), "Вес позиции");
ТЗ.Колонки.Добавить("ОтветСервера", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Ответ сервера");
ТЗ.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Поставщик");
Если Список.Количество() = 0 Тогда
Возврат;
КонецЕсли;
СписокПоставщиков = Новый Массив();
НомераПоставщиков = Новый Массив();
Для Каждого Поставщик Из Список Цикл
Масс = ПодключениеИЗагрузкаДанныхПоставщиков.СтрРазделить(Поставщик, "~", Истина);
НомераПоставщиков.Добавить(Масс[0]);
СписокПоставщиков.Добавить(Масс[1]);
КонецЦикла;
Для Каждого Поставщик Из СписокПоставщиков Цикл
_MPN = "";
_MAN = "";
_QTY = "";
_TKN = "";
_RES1 = "";
_RES2 = "";
Выгрузка = ПодключениеИЗагрузкаДанныхПоставщиков.ПолучитьНастройкиAPIПоставщика(Поставщик);
Если Выгрузка.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Принудительно = Не ПакетнаяОбработка;
МассивПартНомеров = Новый Массив();
МассивПартНомеров = ДанныеПоставщика.ВыгрузитьКолонку("MPN");
Сч = 1;
КоличествоПозиций = МассивПартНомеров.Количество();
Рез = ВыполнитьЗапрос(0, Выгрузка, _MPN, _MAN, _QTY, _TKN, _RES1, _RES2, Сч, Поставщик, Принудительно, СписокПоставщиков, Список,
МассивПартНомеров, КоличествоПозиций, ДанныеПоставщика, НомераПоставщиков, ТЗ, ПакетнаяОбработка);
Если Рез = 0 Тогда
Возврат;
ИначеЕсли Рез = 1 Тогда
Продолжить;
ИначеЕсли Рез = 2 Тогда
Прервать;
КонецЕсли;
Рез = ВыполнитьЗапрос(1, Выгрузка, _MPN, _MAN, _QTY, _TKN, _RES1, _RES2, Сч, Поставщик, Принудительно, СписокПоставщиков, Список,
МассивПартНомеров, КоличествоПозиций, ДанныеПоставщика, НомераПоставщиков, ТЗ, ПакетнаяОбработка);
Если Рез = 0 Тогда
Возврат;
ИначеЕсли Рез = 1 Тогда
Продолжить;
ИначеЕсли Рез = 2 Тогда
Прервать;
КонецЕсли;
Рез = ВыполнитьЗапрос(2, Выгрузка, _MPN, _MAN, _QTY, _TKN, _RES1, _RES2, Сч, Поставщик, Принудительно, СписокПоставщиков, Список,
МассивПартНомеров, КоличествоПозиций, ДанныеПоставщика, НомераПоставщиков, ТЗ, ПакетнаяОбработка);
Если Рез = 0 Тогда
Возврат;
ИначеЕсли Рез = 1 Тогда
Продолжить;
ИначеЕсли Рез = 2 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры |
|||
|
1
программистище
18.04.25
✎
15:43
|
Если у поставщиков не равномерное количество данных, посчитай вхождение, сделай таблицу, назначь веса поставщикам, и равномерно разбей на подсписки, и запускай фоновые с этими списками, в чем проблема то?
по запуску в фоне:В общем виде процесс запуска и обработки результата длительной операции выглядит следующим образом 1) Процедура, которая будет исполняться в фоне, располагается в модуле менеджера объекта или в серверном общем модуле Процедура ВыполнитьДействие(Параметры, АдресРезультата) Экспорт .. ПоместитьВоВременноеХранилище(Результат, АдресРезультата) КонецПроцедуры 2) Запуск операции на сервере и подключение обработчика ожидания &НаКлиенте
Процедура ВыполнитьДействие(
ДлительнаяОперация = НачатьВыполнениеНаСервере()
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект)
..
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьДействиеЗавершение", ЭтотОбъект)
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания)
КонецПроцедуры
&НаСервере
Функция НачатьВыполнениеНаСервере(
ПараметрыПроцедуры = Новый Структура
..
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор)
..
Возврат ДлительныеОперации.ВыполнитьВФоне("Обработка.МояОбработка.ВыполнитьДействие"
ПараметрыПроцедуры, ПараметрыВыполнения)
КонецФункции
3) Обработка результата выполнения операции &НаКлиенте Процедура ВыполнитьДействиеЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда Возврат КонецЕсли Если Результат.Статус ="Ошибка"Тогда СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке) Возврат КонецЕсли ВывестиРезультат(Результат) КонецПроцедуры |
|||
|
2
H A D G E H O G s
18.04.25
✎
11:18
|
(1) плохая стратегия сразу раскидывать.
1. Делим список на порции, пофиг какого веса там внутри данные. 2. Выделяем пул фоновых по числу ядер проца -1. 3. Как только фоновое завершается - создаем ему взамен новое фоновое с новой порцией данных. |
|||
|
3
Mulber
18.04.25
✎
15:37
|
Сделал так, вроде работает:
ПодробностиПроцедура ЗагрузитьЦеныПоставщиковЭксп_Многопоток(Список, ДанныеПоставщика, ПакетнаяОбработка = Ложь) Экспорт ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "N"); ТЗ.Колонки.Добавить("MPN", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN"); ТЗ.Колонки.Добавить("MPNAPI", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(100)), "MPN API"); ТЗ.Колонки.Добавить("КоличествоВЗаказе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Количество в заказе"); ТЗ.Колонки.Добавить("ПроизводительВЗаказе", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель в заказе"); ТЗ.Колонки.Добавить("Производитель", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Производитель"); ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Цена"); ТЗ.Колонки.Добавить("Валюта", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(10)), "Валюта"); ТЗ.Колонки.Добавить("МинКоличествоЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Мин количество заказа"); ТЗ.Колонки.Добавить("КоличествоВУпаковке", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Количество в упаковке"); ТЗ.Колонки.Добавить("НаличиеНаСкладе", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10)), "Наличие на складе"); ТЗ.Колонки.Добавить("СрокПоставки", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Срок поставки"); ТЗ.Колонки.Добавить("СуммаЗаказа", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 5, ДопустимыйЗнак.Неотрицательный)), "Сумма заказа"); ТЗ.Колонки.Добавить("ВесПозиции", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 3)), "Вес позиции"); ТЗ.Колонки.Добавить("ОтветСервера", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Ответ сервера"); ТЗ.Колонки.Добавить("Поставщик", Новый ОписаниеТипов("Строка", Новый КвалификаторыСтроки(0)), "Поставщик"); Если Список.Количество() = 0 Тогда Возврат; КонецЕсли; СписокПоставщиков = Новый Массив(); НомераПоставщиков = Новый Массив(); Для Каждого Поставщик Из Список Цикл Масс = ПодключениеИЗагрузкаДанныхПоставщиков.СтрРазделить(Поставщик, "~", Истина); НомераПоставщиков.Добавить(Масс[0]); СписокПоставщиков.Добавить(Масс[1]); КонецЦикла; ЧислоПараллельныхПотоков = 5; МассивЗаданий = Новый Массив; Для Каждого Поставщик Из СписокПоставщиков Цикл МассивПараметров = Новый Массив; МассивПараметров.Добавить(Поставщик); МассивПараметров.Добавить(ПакетнаяОбработка); МассивПараметров.Добавить(ДанныеПоставщика); МассивПараметров.Добавить(СписокПоставщиков); МассивПараметров.Добавить(Список); МассивПараметров.Добавить(НомераПоставщиков); МассивПараметров.Добавить(ТЗ); Задание = ФоновыеЗадания.Выполнить("ПодключениеИЗагрузкаДанныхПоставщиков.ЗагрузитьДанныеПоставщика", МассивПараметров); МассивЗаданий.Добавить(Задание); Если МассивЗаданий.Количество() >= ЧислоПараллельныхПотоков Тогда Попытка ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий); Исключение КонецПопытки; МассивЗаданий.Очистить(); КонецЕсли; КонецЦикла; Если МассивЗаданий.Количество() > 0 Тогда Попытка ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий); Исключение КонецПопытки; МассивЗаданий.Очистить(); КонецЕсли; КонецПроцедуры Всем откликнувшимся спасибо! |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |