Имя: Пароль:
1C
1С v8
параллельные вычисления, многопоточность через фоновые задания
0 Noxvil
 
11.04.13
15:49
Коллеги, добрый день.

Коллеги, подскажите...

Есть условия:

Регистр сведений: 2 измерения ("Поток" (строка), "Число"(число)) и ресурс ("Сделано"(булево))

Есть регламентное задание, которое ссылается на процедуру с текстом:
   Массив = Новый Массив;
   
   Для Н=1 По 10009 Цикл    
       Массив.Добавить(Н);    
   КонецЦикла;
   
   КоличествоСтрок = Массив.Количество();
   КолвоЗаданий = 5;
   
   КоличествоСтрокВЗадании = Окр(КоличествоСтрок/КолвоЗаданий,0);
   
   Соответствие = Новый Соответствие;
   
   Для ФонЗадание=1 ПО КолвоЗаданий Цикл
       
       КоличествоСтрокВТекущемЗадании = Мин(КоличествоСтрокВЗадании,КоличествоСтрок);
       
       МассивФоновогоЗадания = Новый Массив;
       
       Для ИндексМассиваФоновогоЗадания = 1 ПО КоличествоСтрокВТекущемЗадании Цикл
                                   
           ИндексМассива = Массив.Количество()-1;
           ЭлементМассива = Массив[ИндексМассива];
           
           МассивФоновогоЗадания.Добавить(ЭлементМассива);
           Массив.Удалить(ИндексМассива);
                       
       КонецЦикла;
       
       Соответствие.Вставить("ФонЗадание"+ФонЗадание,МассивФоновогоЗадания);
       
       КоличествоСтрок = КоличествоСтрок - КоличествоСтрокВТекущемЗадании;
       
   КонецЦикла;
   
   Для каждого Элемент Из Соответствие Цикл
       
       МассивПараметров = Новый Массив;
       МассивПараметров.Добавить(Элемент.Значение);
       МассивПараметров.Добавить(Элемент.Ключ);
       
           ФН = ФоновыеЗадания.Выполнить("УправлениеБиллингом.ЗаполнитьРегистр",МассивПараметров,Элемент.Ключ,"ЗаполнитьРегистр");
       
   КонецЦикла;
   
   ФН.ОжидатьЗавершения();    

Есть процедура "ЗаполнитьРегистр" с текстом:

       Для каждого Элемент Из Массив Цикл
           
           НаборЗаписей = РегистрыСведений.ТестированиеМногопоточности.СоздатьНаборЗаписей();
           НаборЗаписей.Отбор.Поток.Значение = Ключ;
           НаборЗаписей.Отбор.Поток.Использование = Истина;
           НаборЗаписей.Отбор.Число.Значение = Элемент;
           НаборЗаписей.Отбор.Число.Использование = Истина;
           НаборЗаписей.Прочитать();
           
           Если НаборЗаписей.Количество() = 0 Тогда
               
               Нстрока = НаборЗаписей.добавить();
               Нстрока.Поток = Ключ;
               Нстрока.Число = Элемент;
               Нстрока.Сделано = истина;
               
           Иначе    
               
               Для каждого Запись Из НаборЗаписей Цикл        
                   Запись.Сделано = Истина;        
               КонецЦикла;
               
           КонецЕсли;

           
           НаборЗаписей.Записать();        
           
       КонецЦикла;


Вопрос в том - как мне сделать возможным понимать и отлавливать когда какое задание закончило работать, чтобы... например повесить на него другую процедуру...
1 mikecool
 
11.04.13
15:50
используй бизнес процесс
2 Noxvil
 
11.04.13
15:54
нее... это не вариант...

Мне интереснее знать, как можно назначить имя обработке фонового задания, а далее её отловить через ожидать завершение, чтобы не писать:

ФН1 = ФоновыеЗадания.Выполнить("УправлениеБиллингом.ЗаполнитьРегистр",МассивПараметров,Элемент.Ключ,"ЗаполнитьРегистр");
ФН2 = ФоновыеЗадания.Выполнить("УправлениеБиллингом.ЗаполнитьРегистр",МассивПараметров,Элемент.Ключ,"ЗаполнитьРегистр");
ФН3 = ФоновыеЗадания.Выполнить("УправлениеБиллингом.ЗаполнитьРегистр",МассивПараметров,Элемент.Ключ,"ЗаполнитьРегистр");
ФН4 = ФоновыеЗадания.Выполнить("УправлениеБиллингом.ЗаполнитьРегистр",МассивПараметров,Элемент.Ключ,"ЗаполнитьРегистр");
ФН5 = ФоновыеЗадания.Выполнить("УправлениеБиллингом.ЗаполнитьРегистр",МассивПараметров,Элемент.Ключ,"ЗаполнитьРегистр");

ФН1.ОжидатьЗавершения();    
ФН2.ОжидатьЗавершения();    
ФН3.ОжидатьЗавершения();    
ФН4.ОжидатьЗавершения();    
ФН5.ОжидатьЗавершения();
3 rs_trade
 
11.04.13
15:59
(2) Складывай в массив ФН и проверяй в цикле завершенность.
4 rs_trade
 
11.04.13
15:59
Или может по ключу получить фоновые и уже в цикле проверить статус выполнения.
5 Fragster
 
гуру
11.04.13
16:04
6 samozvanec
 
11.04.13
16:04
во вчерашней рассылке с инфостарта было
7 Fragster
 
гуру
11.04.13
16:05
МенеджерФоновыхЗаданий.ОжидатьЗавершения (BackgroundJobsManager.WaitForCompletion)
МенеджерФоновыхЗаданий (BackgroundJobsManager)
ОжидатьЗавершения (WaitForCompletion)
Синтаксис:

ОжидатьЗавершения(<ФоновыеЗадания>, <Таймаут>)
Параметры:

<ФоновыеЗадания> (обязательный)

Тип: Массив.
Массив фоновых заданий, завершение которых нужно ожидать.
<Таймаут> (необязательный)

Тип: Число.
Таймаут в секундах ожидания завершения заданий. Если таймаут не задан, ожидание будет длиться до завершения всех заданий, или до первого аварийного завершения задания.
Описание:

Ожидает завершения всех фоновых заданий из списка. Если хотя бы одно задание завершено аварийно, ожидание прерывается и выдается ошибка выполнения задания. Если наступил таймаут, выдается ошибка ожидания задания. Ожидать завершения заданий может только администратор или пользователь, запустивший задания на выполнение.

Доступность:

Сервер, толстый клиент, внешнее соединение.
8 Noxvil
 
11.04.13
16:21
В принципе - понял, спасибо.
9 Fragster
 
гуру
11.04.13
16:23
(8)+ единственное, если одно упадет, то и весь метод ОжидатьЗавершения упадет, надо будет из массива удалять кривое задание и снова вызывать
10 Noxvil
 
11.04.13
17:30
(9) Т.е. создаю менеджер фоновых заданий, запихиваю все фоновые задания в массив и после того, как процедура "МенеджерФоновыхЗаданий" срабатывает - я двигаюсь дальше по своей процедуре... Правильно?
11 Noxvil
 
11.04.13
17:45
(9) Стой, а не проще подключить обработчик ожидания, как в твоей разработке в глобальнике и опрашивать систему 1 раз в 5 минут, далее если фоновые задания есть, то дальше вызываем обработчик, иначе делаем конечную процедуру и отключаем обработчик... м?
12 Noxvil
 
12.04.13
15:28
Fragster - всё же интересно твоё мнение...
13 Fragster
 
гуру
12.04.13
15:34
у меня так было
14 Fragster
 
гуру
12.04.13
15:34
код непрозрачный становится
15 Noxvil
 
12.04.13
15:48
А выполнить можно использовать в методе выполнить?
16 Noxvil
 
12.04.13
15:48
Для каждого Элемент Из Соответствие Цикл
       
       МассивПараметров = Новый Массив;
       МассивПараметров.Добавить(Элемент.Значение);
       МассивПараметров.Добавить(СтруктураТаблицДанныхСФ);
               
       Выполнить("ФоновоеЗадание"+ФонЗадание+" = ФоновыеЗадания.Выполнить(""УправлениеБиллингом.ВыполнитьАсинхронныеПроцедуры"",МассивПараметров,Элемент.Ключ,""ЗаполнитьРегистр)""");
       
   КонецЦикла;
   
   Для ФонЗадание=1 ПО КолвоЗаданий Цикл    
       Выполнить("ФоновоеЗадание"+ФонЗадание+".ОжидатьЗавершения()");
   КонецЦикла;
17 Fragster
 
гуру
12.04.13
15:48
(15) выполнить в выполнить? что за наркомания?
18 Noxvil
 
12.04.13
15:49
(17) - 16
19 Fragster
 
гуру
12.04.13
15:49
(16) а что, массивы уже не модно?
20 Noxvil
 
12.04.13
15:51
Не увидел большой разницы... Но суть, я думаю - ты понял... Тогда будет возможность отловить завершение всех фоновых заданий и пойти дальше по коду процедуры... что скажешь?