Завершение фоновых заданий (проблема реализации многопоточности в 1С) #699578


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

В этой группе 1С