Имя: Пароль:
1C
1С v8
Параллельные вычисления
0 Noxvil
 
05.10.12
18:50
Добрый день.

Прочитал интересную статью про параллельные вычисления (http://softpoint.ru/article_id424.htm).

Вопрос заключается в следующем:

При запуске нескольких фоновых заданий, распределение их на ядра процессора происходит автоматически или это надо прописывать(указывать)?
1 Noxvil
 
05.10.12
18:51
Чёрт возьми, уже вечер...
2 del123
 
05.10.12
18:53
в понедельник пиши :D
3 Noxvil
 
05.10.12
19:01
Буду рад скорейшему ответу.
4 РазДва
 
05.10.12
19:02
(0) даже если все они(фоновые задания) попадут на один rphost, они будут не на одном ядре и рулить распределением по ядрам ты не сможешь, да и не нужно
5 kotletka
 
05.10.12
19:03
а нифига по ядрам практически не распределяется
6 РазДва
 
05.10.12
19:17
(0) ещё учти, что все эти "параллельные вычисления" реально могут напрячь сервер приложений, и при огранниченных ресурсах днем количество потоков, которые можно запустить без ущерба для общего быстродействия, не так уж велико.
У нас восстановление последовательностей по партиям и реализации, по восемь потоков каждое, выводит сервер("с 16-ью ядрами") на 100% загрузку
7 Noxvil
 
05.10.12
19:19
У меня 4 ядра, собственно столько потоков я и хочу запустить... Это логичное решение?)
8 Fragster
 
гуру
05.10.12
19:20
9 Noxvil
 
08.10.12
17:20
Добрый день, коллеги.
На текущий момент вопрос складывается такой:

Как управлять количеством запущенных фоновых заданий на основе одного регламентного задания?
10 Noxvil
 
08.10.12
17:31
Буду очень признателен за грамотный ответ.
11 Noxvil
 
08.10.12
17:34
Буду признателен за ответ, который подтолкнёт к нужному решению...
12 РазДва
 
08.10.12
17:40
(9) Видимо, следует написать некое подобие своего примитивного диспетчера потоков.
13 oleg_km
 
08.10.12
17:42
rphost многопоточное приложение, поэтому фоновые задания крутятся в разных потоках. Как эти потоки будут распределяться по камням, по-моему рулит Windows. По крайней мере 1С не содержит функций распределения фоновых заданий не только по процессорам, но и даже по rphost'ам
14 Noxvil
 
08.10.12
17:44
Ну а как мне запустить определённое количество фоновых заданий?
Или можно запустить только одно задание регламентное?
15 Noxvil
 
08.10.12
17:45
(12) Просмотрел.

Надо ориентироваться на количество запущенных фоновых заданий и если их больше 4, то не запускать регламентное задание?!
16 РазДва
 
08.10.12
17:50
(15) В одном регламентном реализовать "диспетчер", который будет запускать фоновые, а там уж проверять, занят ли поток, ожидать завершения и прочее, это тонкости реализации..
17 Стрим
 
08.10.12
18:26
Я вообще то в программировании слабо разбираюсь.
Но вышеизложенный способ реализации параллельности вычислений, для меня,начинающего 1Сника выглядит как бред.

Цитата из Википедии:
"Основная сложность при проектировании параллельных программ — обеспечить правильную последовательность взаимодействий между различными вычислительными процессами, а также координацию ресурсов, разделяемых между процессами."

Последовательность не всегда предсказуема и зависит от того какой компилятор применяется.Т.е. для эффективного распараллеливания процессов такая возможность должна быть изначально заложена в платформу 1С (возможно ZeroMQ либо другая подобная технология).

Но повторюсь - это мое ИМХО. 1С я начал изучать несколько месяцев назад и до этого программированием не занимался.
У 1с явно сложности с параллелизмом. Платформа писалась на С++. Ни о применении функционального программирования, ни о других методах повышения скорости вычислений относительно своей платформы 1с никогда не заикалась.
Да какая параллельность вычислений, если у 1с даже среда разработки дубовая. Сравните с Visual Studio
18 Fragster
 
гуру
08.10.12
18:29
(17) восстановление последовательности в несколько потоков - вполне реальная вещь
19 Стрим
 
08.10.12
18:30
Добавлю еще. Максимум чего можно добиться - это неведомым выебоном загрузить вычислениями все ядра. Но само по себе это не обеспечит повышение быстродействия. В отдельных случаях даже замедлит
20 Fragster
 
гуру
08.10.12
18:30
а умные слова типа "функционального программирования" - лишь способ сделать свой пост "умнее"
21 Стрим
 
08.10.12
18:34
(18) может быть. Надо разобраться.
функциональное - ага :) надо же выебнуться :)Просто насколько я слышал некоторые функциональные языки не имеют проблем с параллельностью. Только на них реально никто не пишет
22 РазДва
 
08.10.12
18:50
(17) просто тут не совсем параллельные вычисления, а обычное разбиение неких не пересекающихся действий на части и их параллельное выполнение, для более полной загрузки имеющихся ресурсов, чем при последовательном выполнении, вполне реализуемо и на 1с, безо всяких цитат на википедию и технолгий типа ZeroMQ.
Путь человек займется, правда боюсь для 4 ядер он не будет сильно впечатлен результатом, уж не знаю какие именно действия собираются распараллелить.
23 РазДва
 
08.10.12
18:57
(17) да даже обычные бухгалтера могут распараллелить 1С - запустить два клиента, а они вообще не в курсах про дубовость среды разработки.
А сравни бухгалтера с программистом, уверен, Noxvil распараллелит 1С и даже свою "зероэмку" придумает и тоже попадет в викепедию
24 МуМу
 
08.10.12
19:32
(0) Не слушай никого - все реально. Единственно что не все прикладные задачи хорошо распараллеливаются. Задача какая стоит?
25 Стрим
 
08.10.12
20:03
(24) вы не путайте человека. Суть вопроса:"Могу ли я повлиять на распределение потоков по камням средствами 1с, тем самым ускоряя обработку? "
Нет, не сможете.
Можно ли ускорить проведение документа через реализацию "механизма многопоточного проведения" ? Ну если это оптимизирует работу конфигурации, то да.
26 РазДва
 
08.10.12
20:50
(25) не было ни первого, ни второго вопроса )
Вы подогнали вопросы под свои заумствования.
27 МуМу
 
08.10.12
22:27
(26)+1
28 mistеr
 
09.10.12
02:27
(15) Может наконец пора озвучить решаемую таким образом задачу?

Что пытаемся распараллелить? Что реально делает код - он таки что-то усиленно вычисляет или он исполняет запросы?
29 Noxvil
 
11.10.12
12:35
Необходимо последовательно перепровести около сотни тысяч документов "Списание с расчетного счета".
Предположил, что если я разобью перепроведение на 4 потока, то ускорю процесс.
Разбивать потоки собрался по контрагентам, ну и по моменту времени уже в потоке.
30 Noxvil
 
11.10.12
12:41
Коллеги, я так понимаю - двигаюсь в правильном направлении...
31 5 Элемент
 
11.10.12
12:46
За 5 дней провел бы уже обычным способом
32 Fragster
 
гуру
11.10.12
12:47
не факт. нужно сначала проанализировать блокировки, возникающие при проведении. возможен вариант, когда вообще не проводятся документы параллельно
33 Noxvil
 
11.10.12
12:47
(31)Спасибо КЭП :)

Но мне интересна сама технология...
34 Fragster
 
гуру
11.10.12
12:47
(31) смотря сколько документ проводится. если минуту - то нет
35 Noxvil
 
11.10.12
12:48
Уже попробовал запустить 2 сеанса одновременно, прирост скорости был. Но не могу точно сказать - какой...
36 5 Элемент
 
11.10.12
12:51
(34) если документ проводится минуту, я лучше бы этой проблемой занялся :)
37 ptiz
 
11.10.12
12:51
(29) Запусти несколько 1С. В каждой сделай отбор по своему списку контрагентов.
И жми "провести".
38 0xFFFFFF
 
11.10.12
12:54
(17) "Да какая параллельность вычислений, если у 1с даже среда разработки дубовая. "
Да видел я глаза трупрограммистов, которые впервые узнали, что у 1С тоже есть дебаггер...
39 Noxvil
 
11.10.12
13:09
(37) - (33)

Кстати, в статье, которую я привёл в первом посте.
Ребята запускали обработку в регламентном задании и если видели, что есть доки к перепроведению, то запускалось несколько потоков... Но у меня запускается только один, не понимаю...

Только что допёрло, что именно в момент запуска регламентного задания и надо запускать фоновые задания с разными ключами. Собственно основное регламентное задание и есть диспетчер... Правильно?
Код запуска фонового задания - ФоновыеЗадания.Выполнить("СтрокаЗадания.ИмяМетода") и оно как раз и будет запускаться на сервере, т.к. регламентное запускается на сервере.

(16) пропустил я твой пост... изобрёл велосипед
40 TTimur
 
11.10.12
13:52
Я, конечно, извиняюсь. Но, мне кажется, что распараллеливать какие-либо процессы в 1с часто не имеет смысла т.к., обычно, производительность упирается не в загрузку процессора/ядра  а в дисковую подсистему.
41 Noxvil
 
11.10.12
14:09
Если обратить внимание на мой первый пост, то там используется очень неплохой пример.
Ну и моя задача тоже подразумевает перепроведение...
42 Fragster
 
гуру
11.10.12
14:37
интересно, есть ли способ взаимодействовать с фоновым заданием не через базу?
43 Fragster
 
гуру
11.10.12
14:37
типа параметров сеанса
44 TTimur
 
11.10.12
14:44
(41) В первом посте нет задачи, там вопрос "как происходит?". А хотелось бы посмотреть на формулировку задачи для 1С, для решения которой распараллеливание имело бы смысл.
45 ДенисЧ
 
11.10.12
14:48
(42) не через базу - это как? через сторонние сервисы?
46 Fragster
 
гуру
11.10.12
14:49
(45) ну типа глобальных переменных, чтобы семафоры ставить правильно.
47 ДенисЧ
 
11.10.12
14:49
(46) а... справочник и блокировки :-)
48 TTimur
 
11.10.12
14:55
+(44) Прочитал задачу по ссылке - похоже, там изначально проблемы не с производительностью (скоростью выполнения) а с возможностью работы вообще: большим объемом данных, который 1с не смогла "переварить" в одном документе.
49 Noxvil
 
11.10.12
15:29
(48) Да, но как побочный эффект - скорость выполнения выросла.
(42) Думаю, что фоновое задание может обращаться к набору параметров через определённый этап работы в цикле. Параметры могут быть константами...
50 Stepa86
 
11.10.12
15:33
(42) в фоновое задание в вызываемый метод можно параметры передать, обратно можно выкрутиться через СообщениеПользователю - Сообщить в задании и фоновоеЗадание.ПолучитьСообщенияПользователю(<УдалятьПолученные>)
51 Stepa86
 
11.10.12
15:35
+ (50) так же задание можно рубануть и запустить новое с новыми параметрами, еси чо
52 Fragster
 
гуру
11.10.12
15:41
(51) ну, допустим, у нас есть стек заданий, 3 потока. через базу (упрощенно) - мы диспетчером запихиваем очередь, запускаем фоновые задания, задание читает хвост, удаляет, выполняет, читает хвост... при этом время выполнения одной задачи может в разных потоках различаться в разы. Как убрать в этом случае оращение к базе?
53 Fragster
 
гуру
11.10.12
15:50
перезапускать задания - не вариант, потому что очень много накладных расходов получается
54 Stepa86
 
11.10.12
15:51
(52) если я правильно тебя понял (хотя немного сомневаюсь), то в диспетчере (спец. метод, который все запускает, который сам может быть запущен в фоне) есть массив, он берет последний элемент и стартует по нему задание, задания и элемент в соответствие.

когда 3 потока запущены: ФоновыеЗадания.ОжидатьЗавершения( Наши3ФоновыхЗадания, 1 ), после завершения ожидания (выход по таймауту генерит ошибку) проверяем состояния заданий, если есть завершенные, удаляем элементы из массива согласно соответствию и стартуем новые.
55 Stepa86
 
11.10.12
15:54
+(54) если диспетчером является форма, то там можно вместо ОжидатьЗавершения сделать через обработку ожидания
56 Fragster
 
гуру
11.10.12
15:54
ФоновыеЗадания.ОжидатьЗавершения( Наши3ФоновыхЗадания, 1 ) не подходит, так как одно задание может идти 10 секунд, а 2 других - по секунде. + очень большие накладные расходы на старт/стоп заданий, так что лучше бы не перезапускать их, а организовать работу с 1 очередью
57 Stepa86
 
11.10.12
15:59
(56) ожидать завершения подождет секунду и либо вывалиться с ошибкой, что не завершилось, мы ее ловим попыткой, смотрим что завершилось, что нет и что то делаем с этим. Либо ошибки не происходит, а значит все задания выполнились
58 Fragster
 
гуру
11.10.12
16:00
если через СУБД, то менеджер записывает, допустим в РС, очередь.  запускает фоновые задания, каждое задание берет задачу из очереди, удаляет запись, выполняет. берет следующую задачу. тогда обеспечивает равномерность нагрузки на потоки выполнения задач

(57) часто стартовать задания - слишком долго
59 Stepa86
 
11.10.12
16:00
+(57) задания не останавливаются от того, что мы перестали их ждать... вроде бы
60 Fragster
 
гуру
11.10.12
16:02
(59) да, продолжают, но выдавать по одной задаче в фон - слишком накладно.
61 Stepa86
 
11.10.12
16:03
(58) от задачи зависит, я не думаю, что если у нас есть охеренная очередь, в которой один элемент отрабатывает свыше 10 секунд, а заранее на 3 равномерных потока мы разбить не можем, то мы много потеряем на старте фоновых задач.
62 Stepa86
 
11.10.12
16:05
(60) всю тему не читал. Замеры делал? мы про какой порядок говорим?
63 Fragster
 
гуру
11.10.12
16:07
(62) если делать ФоновыеЗадания.ОжидатьЗавершения( Наши3ФоновыхЗадания, 1 ), проверять, какие завершились, запускать новые, тогда очень много стартов фоновых задач.
64 Stepa86
 
11.10.12
16:11
(63) много, это серьезная проблема? мы можем потерять на старте заданий 1 секунду, на неправильном распределении заранее - десятки секунд, на отсутствии параллельности часы... Через базу то наверно оптимальнее всего будет, но опять же от конкретного задания зависит
65 Fragster
 
гуру
11.10.12
16:18
(64) вариант с хранением очереди в СУБД быстрее, чем старт кучи фоновых заданий. но при этом постоянно дергается одна и та же таблица, что не очень мне нравится. даже непонятно, как замерить, какой % времени происходит на забирании задачи из базы :(
66 Fragster
 
гуру
11.10.12
16:21
(64) зачастую время выполнения атомарной (т.е. далее неделимой) задачи сопоставимо с временем старта фонового задания, просто таких задач может быть очень много.
67 Stepa86
 
11.10.12
16:22
(65) кучу стартующих задач можно уменьшить, передавая не по одному элементу, а какую то часть. Да и при грамотном регистре нет ничего плохого в его использовании
68 Noxvil
 
11.10.12
17:33
Для себя решение моей задачи я увидел такое:

Создаю регистр сведений

ЗадачиКВыполнению

Измерения: поток (фоновое задание, может разделяться ключами), ссылка на объект
Ресурсы: проведён, заблокирован, ошибка, комментарий

Создаю регистр сведений:

ФоновыеЗадания
Измерения: поток
Ресурсы: Заблокирован (используется)

Обработка:

ДиспетчерФоновыхЗаданий:

Возможности:

Разбиение документов к перепроведению на потоки, установка количества активных потоков(фоновых заданий), запуск потоков (фоновых заданий)
69 МуМу
 
11.10.12
18:25
Для начала бы сделал бы без фоновых задач, что бы обкатать схему. Основная проблема для подобных задач - убрать все избыточные блокировки а затем не допустить грязного чтения посредством семафоров или тех же блокировок.Запусти допустим 4-е одинэски и поставь себе задачу распаралллелить проведение.
70 МуМу
 
11.10.12
18:29
Вообщем все зависит от логики документа "Списание с расчетного счета".
Почитай еще такой пример
http://softpoint.ru/article_id375.htm
Здесь применяется немного другой подход.Все зависит от предметной логики. ПОэтому в этой сфере не бывает универсальных решений.
71 Noxvil
 
11.10.12
18:30
Так разделить на контрагентов не составляет особенного труда... Берём все доки, смотрим сколько у каждого контрагента, потом по методу фифо (или лифо, всё время путаю) делим всё на 4 части...
72 Noxvil
 
11.10.12
18:31
(70) Обязательно, но уже вечером или завтра. Всем хорошо сегодня отдохнуть )
73 Стрим
 
11.10.12
18:43
(26), (27) - что тут подгонять? Я пытался сказать что ТС ошибается.
Если на пальцах- оптимальное количество потоков не равняется числу ядер процессора.
74 vde69
 
11.10.12
19:03
я не советую распаралеливать вычисления (хотя для отдельных задач это можно реализовать)

причины
1. распаралеливание может привести к дедлокам
2. распаралеливание довольно тяжело отлаживать и искать в нем ошибки
3. средний уровень 1с прогов на столько низкий, что после увольнения автора сиего чуда конфигурация просто умрет....

автору советую начать с оптимизации скорости тех алгоритмов которые есть сейчас (включая оптимизацию SQL). МуМу правильно говорит но, он не учитывает то что у него есть соответствующая квалификация и опыт а у большенства 1с ников этого нет....
75 МуМу
 
11.10.12
19:05
Оно зависит от степени распераллеливания задачи.Есть задачи которые вообще не распараллеливаются и заисит от ресурсов сервера. К примеру если диск станет узким местом в одном потоке - нет смысла вообще делить на потоки. Ну а остальное все ньюансы.(затраты на диспечеризацию и т.п.)
76 vde69
 
11.10.12
19:09
(75) я паралелил 2 задачи

1. востановление последовательности
2. начисление процентов

в обоих случаях после меня проги все переписали в один поток, потому как не смогли внести даже мелкие исправления :)

ИХМО
в данном случае минусы сложности решения занчительно перекрывает положительный эффект по быстродействию
77 bahmet
 
11.10.12
19:11
Noxvil рвёт шаблоны общения на Мисте...нехорошо )
78 Fragster
 
гуру
11.10.12
19:11
(76) ну, это смотря как писать. можно и понятно написать.
79 Fragster
 
гуру
11.10.12
19:12
вот я какую-то обработку писал с неблокирующимся интерфейсом но без фоновых заданий - каждая следующая итерация в обновлении отображения, вот это была жесть...
80 Noxvil
 
12.10.12
11:32
Коллеги, добрый день.

Дискуссия продолжается!

(78) Жму руку.

"Дабы раскрыть секрет":
Считаю себя средним программистом, способным создать сложную систему. Опыт разработки - 3 года.
Обожаю сверх "красивый" и "оптимизированный"(интеллектуальный) код, который не всегда бывает понятен... )

Если не ошибаюсь, то в отладчике можно запустить отладку фоновых заданий... Не вижу трудностей с отладкой, т.к. скорее всего можно определить фоновое задание по ключу.
81 Noxvil
 
12.10.12
11:48
(74) Коллеги, в ответ на этот пост. Сознаюсь, что с оптимизацией таблиц в SQL я никогда не сталкивался... Подскажите пару статей с максимально эффективной методикой переиндексации, либо оптимизации работы сервера.

sql 2008, windows server 2008, 1c 8.2
82 vde69
 
12.10.12
12:14
(81)
http://kb.mista.ru/2/doku.php?id=it:analiz_sql_block&rev=1347946765
ну и про регламент SQL почитай на проф сайтах
83 Noxvil
 
12.10.12
15:06
Ок, почитаю. Спасибо.