|
Многопоточная запись файлов в pdf в фоне |
☑ |
0
jedbez
15.03.20
✎
12:26
|
Чтото не получается
8.3.16
Создаю на сервере многопоточную генерацию табличных документов, заполняю их (набор однотипных этикеток). На выходе получаю 1 табличный документ, который необходимо записать как pdf.
Если без могопоточности то всё ок, а с ней выпадает Аварийно завершился процесс фонового задания. Причем 10 из 40 файлов записались корректно, и 2 по 15 байт
Если отключить запись в файл, то тоже всё ок. Подскажите куда копать.
КоличествоПотоковПечати = 4;
МассивЗаданий = Новый Массив;
Для каждого ЭлGTIN Из ТЗ Цикл
//СформироватьЭтикеткиИЗаписатьВФайл(ЭлGTIN.GTIN);
МассивПараметров = Новый Массив;
МассивПараметров.Добавить(ЭлGTIN.GTIN);
Задание = ФоновыеЗадания.Выполнить("ВзаимодействиеСервер.СформироватьЭтикеткиИЗаписатьВФайл", МассивПараметров);
МассивЗаданий.Добавить(Задание);
Если МассивЗаданий.Количество() >= КоличествоПотоковПечати Тогда
Попытка
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
Исключение
ВызватьИсключение СтрШаблон(ТекстОшибки, ОписаниеОшибки());
КонецПопытки;
МассивЗаданий.Очистить();
КонецЕсли;
КонецЦикла;
Если МассивЗаданий.Количество() > 0 Тогда
Попытка
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
Исключение
ВызватьИсключение СтрШаблон(ТекстОшибки, ОписаниеОшибки());
КонецПопытки;
МассивЗаданий.Очистить();
КонецЕсли;
Процедура СформироватьЭтикеткиИЗаписатьВФайл(GTIN) Экспорт
*******************
ПараметрыФормирования = Новый Структура
**************************************
Данные = ПечатьЭтикеток.ПолучитьЭтикетки_V2(ПараметрыФормирования);
Данные.ТД.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);
КонецПроцедуры
|
|
1
acht
15.03.20
✎
12:33
|
А не в один и тот же файл ты их параллельно записать пытаешся?
|
|
2
Garykom
гуру
15.03.20
✎
13:42
|
(0) Начни с
|
|
3
Cyberhawk
15.03.20
✎
14:02
|
Что-то у тебя не тру-многопоточность - когда активных стало столько, сколько задано в настройке, все ставится на паузу до _полной_ обработки этой порции.
|
|
4
jedbez
15.03.20
✎
15:38
|
(1) Нет, но все равно проверю. Наверно вставить надо проверку перед записью на существование файла.
(2) Сяп, почитаю.
(3) Ну да, иначе перегрузка может произойти процессора. Итого, порциями по 4 потока.
|
|
5
jedbez
16.03.20
✎
01:55
|
(2) Познавательно. Но насколько я понял часть описанных принципов реализуется платформой 1С
Похоже проблема возникает при больших файлах, более 10 Мб.
Решил проблему сохраняя pdf сначала в память, а мотом как двоичный код выгружаю в файл на диск.
Птк = Новый ПотокВПамяти;
Данные.ТД.Записать(Птк, ТипФайлаТабличногоДокумента.PDF);
ДД = Птк.ЗакрытьИПолучитьДвоичныеДанные();
ДД.Записать(""+ПутьСохранения+"\"+ИмяФайла_);
|
|
6
jedbez
16.03.20
✎
12:49
|
Блин нгифига не решил, иногда ндаже на мелких файлах "Аварийно завершился процесс фонового задания"
|
|
7
Cyberhawk
16.03.20
✎
13:26
|
(6) Платформу обнови
|
|
8
Cyberhawk
16.03.20
✎
13:27
|
Не поможет - багрепорт на тестплатформ
|
|
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший