|
параллельные вычисления, многопоточность через фоновые задания | ☑ | ||
---|---|---|---|---|
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
|
Не увидел большой разницы... Но суть, я думаю - ты понял... Тогда будет возможность отловить завершение всех фоновых заданий и пойти дальше по коду процедуры... что скажешь?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |