|
Завершение фоновых заданий (проблема реализации многопоточности в 1С) | ☑ | ||
---|---|---|---|---|
0
adelaide
21.02.14
✎
13:55
|
Пытаюсь реализовать многопоточность в 1С при помощи фоновых заданий.
Обработка запускает 100 потоков (фоновых заданий), на выполнение им выделяется 20 секунд, после чего задания грохаются: тФоновоеЗадание.Отменить(); и запускается новая партия фоновых заданий, так вот, проблема в том что не всегда они завершаются, и на сервере они накапливаются и база зависает. Версия платформы: 8.2.19.83 |
|||
1
Dolphinbet
21.02.14
✎
14:09
|
Зачем??
|
|||
2
adelaide
21.02.14
✎
14:11
|
(1) что зачем? многопоточность? ну есть у меня такая задача, цены конкурентов парсить.
Кусок кода, может в нем что не так :( : Если МассивЗаданий.Количество() >= ЧислоПараллельныхПотоков Тогда Попытка ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий, 15); Исключение //что-то пошло не так, даем 15 сек. завершится заданиям: глПауза(15); КонецПопытки; //----------------------------------------------------------------- //все что не успело завершится завершаем принудительно: //----------------------------------------------------------------- Отбор = Новый Структура; Отбор.Вставить("Наименование", "ПолучениеПредложений"); Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); мФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); Если мФоновыеЗадания.Количество() > 0 Тогда Для каждого тФоновоеЗадание Из мФоновыеЗадания Цикл тФоновоеЗадание.Отменить(); КонецЦикла; КонецЕсли; //----------------------------------------------------------------- МассивЗаданий.Очистить(); КонецЕсли; |
|||
3
zladenuw
21.02.14
✎
14:12
|
(2) ну на фига его в потоки ?
|
|||
4
zladenuw
21.02.14
✎
14:13
|
(2) еще раз смотришь как реализовано тут
http://infostart.ru/public/182139/ |
|||
5
fisher
21.02.14
✎
14:18
|
ИМХО, контролировать стек заданий через "гроханье" - изначально не лучшая идея.
|
|||
6
ДенисЧ
21.02.14
✎
14:18
|
Не делай отменить(), выставляй флаг завершения, в задании его проверяй и закругляйся.
|
|||
7
adelaide
21.02.14
✎
14:23
|
(5) может и так, но оно у меня все равно будет запускать новые фоновые пока все не переварит...
(3) чтоб быстрей было (6) не понял, как? приведи пример кода, у фонового задание есть свойство состояние но оно вроде только на чтение. |
|||
8
adelaide
21.02.14
✎
14:29
|
(4) вот как раз по тому примеру и делал, и после его отработки у меня скапливается много незавершенных фоновых заданий которые валят сервер, потому как этот кусок кода:
|
|||
9
Torquader
21.02.14
✎
14:29
|
Только мне одному кажется, что из-за "столкновения" транзакций задание может "повиснуть" на ожидании захвата блокировки объекта, то есть на обращении к SQL-серверу.
В этом состоянии корректно его грохнуть не получится, так как транзакция отвалится, когда сервер ей позволит. В итоге, вы просто "загаживаете" буфер транзакций - оно вам надо ? |
|||
10
adelaide
21.02.14
✎
14:29
|
Если МассивЗаданий.Количество() >= ЧислоПараллельныхПотоков Тогда
Попытка ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий); Исключение КонецПопытки; МассивЗаданий.Очистить(); КонецЕсли; |
|||
11
adelaide
21.02.14
✎
14:30
|
короче кусок кода из (10) он не завершает задания, он только ожидает их завершения, а если одно задание фейнулось он просто очистит массив и запустит новый пакет фоновых заданий.
|
|||
12
adelaide
21.02.14
✎
14:32
|
(9) не в моем случае, у меня фоновые задания работают только с временным хранилищем, объекты СУБД не блокируются.
|
|||
13
Torquader
21.02.14
✎
14:52
|
(12) А нафига они тебе вообще тогда - клади данные в файл и запускай процессы на php - там их душить не передушить, что хочешь, то с ними и делай.
|
|||
14
adelaide
21.02.14
✎
14:56
|
(13) в конечном итоге хотелось бы решить задачу средствами 1С, оно конечно на php проще и ресурсов меньше будет жрать, но это еще php нужен...
|
|||
15
Torquader
21.02.14
✎
15:00
|
(14) Просто, если процессы не обращаются к самой базе, то зачем они такие вообще нужны ?
|
|||
16
Dolphinbet
21.02.14
✎
15:06
|
парсить цены конкурентов - all-sku.ru
|
|||
17
Torquader
21.02.14
✎
15:10
|
(16) Если что-то парсить, то тогда точно php
|
|||
18
Dolphinbet
21.02.14
✎
15:10
|
nodeJS лучше)
|
|||
19
hhhh
21.02.14
✎
15:14
|
(14) но можно же одним заданием, зачем 200 заданий запускать?
|
|||
20
Dolphinbet
21.02.14
✎
15:15
|
(19) по всей видимости для параллельного получения данных страниц с ценами
|
|||
21
hhhh
21.02.14
✎
15:19
|
(20) цены же у конкурентов не каждый день меняются. Может раз в полгода.
|
|||
22
Dolphinbet
21.02.14
✎
15:20
|
бывает и несколько раз в день, например на смартфоны)
|
|||
23
Torquader
21.02.14
✎
15:24
|
Ну, если все конкуренты друг у друга цены мониторят, то да - всё меняется очень и очень динамично.
|
|||
24
Asmody
21.02.14
✎
15:25
|
(19) может у него сервант о двухсот головах?
|
|||
25
Torquader
21.02.14
✎
15:28
|
(24) Проще 200 голов по сети собрать - тем более, для парсинга - самое оно.
|
|||
26
MM
21.02.14
✎
15:30
|
Запуск и остановка задания самая затратная по ресурсам штука, не правильнее ли реализовать, что-то вроде пула фоновых заданий. Или есть серьёзный риск, что они повиснут на сетевых операциях?
|
|||
27
Torquader
21.02.14
✎
15:31
|
Мне кажется, что это всё вообще можно на отдельную машину вынести, чтобы в 1С попадал только готовый результат.
|
|||
28
adelaide
21.02.14
✎
16:22
|
(21) ню-ню, у нас в Украине цены каждый час меняются =)
|
|||
29
adelaide
21.02.14
✎
16:27
|
(26) хм, возможно ты и прав, попробую, но это не отменяет проблемы корректного завершения фоновых заданий.
(24) (25) Не, вполне хватает обычного i7 |
|||
30
Kalambur
21.02.14
✎
16:30
|
(28) да майдан пройдет и хотелка тоже потеряет смысл..
|
|||
31
adelaide
21.02.14
✎
16:34
|
(30) не хотелка появилась задолго до майдана и уже больше чем пол года как фунциклирует :-Р.
|
|||
32
adelaide
24.02.14
✎
19:24
|
апну тему, платформа не завершает нормально фоновые задания, они остаются висеть в консоли, хотя из консоли их удается завершить.
|
|||
33
adelaide
24.02.14
✎
19:24
|
кто сталкивался и что делать?
|
|||
34
Torquader
24.02.14
✎
19:29
|
(33) Нужно смотреть, что там с ним произошло и в какой стадии оно находится.
|
|||
35
Torquader
24.02.14
✎
19:30
|
Потом, если вы лезете в сеть, то можно ожидать, что пока получение данных не окончено, соединение корректно не будет закрыто.
А если в задания вставлять проверку наличия файлов и т.п., чтобы определить момент, когда его нужно максимально быстро завершить. |
|||
36
adelaide
24.02.14
✎
19:34
|
(35) >если вы лезете в сеть, то можно ожидать, что пока получение данных не окончено, соединение корректно не будет закрыто.
Я выставляю таймаут для соединений. >А если в задания вставлять проверку наличия файлов и т.п., чтобы определить момент, когда его нужно максимально быстро завершить. Что имелось ввиду? |
|||
37
adelaide
24.02.14
✎
19:35
|
(34) а они могут висеть в другом состоянии кроме "Активно"?
|
|||
38
adelaide
24.02.14
✎
19:36
|
блин 1С стоит подумать о новом состоянии для фоновых - "Зависло"
|
|||
39
Torquader
24.02.14
✎
19:36
|
(36) Просто, если задание выполняет какое-то действие, то в нём нужно периодически проверять состояние какого-то флага, чтобы если он установлен - сразу его завершить.
Кстати, по опросу в сеть - сколько максимально можно держать соединений в состоянии "установка" в XP, насколько я помню, было 10 - просто - остальные висят и не обращаются в сеть, пока им не дадут на это право - при этом, таймаут не считается, так как он начнёт считаться только с того момента, когда пакет пойдёт в сеть. |
|||
40
Torquader
24.02.14
✎
19:37
|
(38) Нормальное задание не может зависнуть - если, конечно вы их "валите", то есть вероятность подвесить tcp-стек, но тогда у вас уже не только задания, а и вообще всё взаимодействие будет висеть.
|
|||
41
adelaide
24.02.14
✎
19:44
|
(39)
с флагом конечно вариант, но не думаю что изнутри оно лучше отработает чем снаружи, так как я после таймаута данного на выполнение фоновых заданий прохожусь по массиву этих заданий и грохаю их: Задание = ФоновыеЗадания.Выполнить("Многопоточность.МП_ПолучениеПредложений", МассивПараметров, Ключ, "ПолучениеПредложений"); КонецЕсли; МассивЗаданий.Добавить(Задание); Если МассивЗаданий.Количество() >= ЧислоПараллельныхПотоков Тогда Попытка ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий, 25); Исключение //что-то пошло не так, даем 25 сек. завершится заданиям: глПауза(10); КонецПопытки; //----------------------------------------------------------------- //все что не успело завершится завершаем принудительно: //----------------------------------------------------------------- Отбор = Новый Структура; Отбор.Вставить("Наименование", "ПолучениеПредложений"); мФоновыеЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); Если мФоновыеЗадания.Количество() > 0 Тогда Для каждого тФоновоеЗадание Из мФоновыеЗадания Цикл тФоновоеЗадание.Отменить(); КонецЦикла; КонецЕсли; //----------------------------------------------------------------- МассивЗаданий.Очистить(); КонецЕсли; у меня виндовс сервер 2008, там вроде таких ограничений нет. |
|||
42
Torquader
24.02.14
✎
19:57
|
(41) А ты уверен, что интернет-канал таких ограничений не имеет.
Потом, я бы как-то научился общаться с заданиями, чтобы знать, в каком оно состоянии находится, а не только - вам дано время или сделай или сдохни. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |