Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов.

0. Иван Филимонов (DarkAn) 360 24.05.17 09:22 Сейчас в теме
Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее.
* Есть желание повысить скорость работы медленных алгоритмов! Но...
* Нет времени думать о реализации многопоточности?
* о запуске и остановке потоков?
* о поддержании потоков в рабочем состоянии?
* о передаче данных в потоки и как получить ответ из потока?
* об организации последовательности?
Тогда ЭТО - то что надо!!!

Перейти к публикации

Лучшие комментарии
42. Ольга Петровская (pt_olga) 62 18.07.17 11:49 Сейчас в теме
эпохальный труд! респект!
Darklight; igo1; support; +3 Ответить 1
Остальные комментарии
1. Александр Монагаров (promogiantworm) 55 29.05.17 10:47 Сейчас в теме
Верните картинки!
KazanKokos; TreeDogNight; +2 Ответить 2
2. Иван Филимонов (DarkAn) 360 29.05.17 10:58 Сейчас в теме
(1) Сейчас решим с модераторами
3. Иван Филимонов (DarkAn) 360 29.05.17 11:08 Сейчас в теме
4. Иван Филимонов (DarkAn) 360 29.05.17 11:23 Сейчас в теме
5. Анатолий Лукьянов (KazanKokos) 9 29.05.17 11:26 Сейчас в теме
6. Иван Филимонов (DarkAn) 360 29.05.17 11:32 Сейчас в теме
7. Анатолий Лукьянов (KazanKokos) 9 29.05.17 11:33 Сейчас в теме
(6) имеется ввиду в самой публикации вместо картинок крестики
8. Иван Филимонов (DarkAn) 360 29.05.17 11:35 Сейчас в теме
(7) А сейчас? Просто - у меня все ок. Если нет - еще раз перезалью
9. Анатолий Лукьянов (KazanKokos) 9 29.05.17 11:41 Сейчас в теме
у меня так и так далее по всей странице
Прикрепленные файлы:
10. Анатолий Лукьянов (KazanKokos) 9 29.05.17 11:55 Сейчас в теме
11. Иван Филимонов (DarkAn) 360 29.05.17 11:56 Сейчас в теме
(9) Перезалил картинки и перебил ссылки. Теперь видно?
12. Иван Филимонов (DarkAn) 360 29.05.17 11:56 Сейчас в теме
13. Виталий Барилко (Diversus) 2281 29.05.17 15:41 Сейчас в теме
Не совсем понятны результаты до и после. Т.е. с использованием механизма и без него.
Сколько по времени занимало?
14. Иван Филимонов (DarkAn) 360 29.05.17 16:09 Сейчас в теме
(13) Результаты из первой таблицы?
Колонки с месяцами - это месяцы за который восстанавливались партии.
Есть 2а показателя: "Однопоточное восстановление" и "Параллельное восстановление"

Первый показывает сколько времени занимало восстановление партий в типовом варианте (один поток): для восстановления партий за "Ноября 2016" при первом запуске было затрачено 293 мин. При повторном (сразу после первого) запуске - 265 мин.

При этом при использовании механизма распараллеливания тот же самый период "Ноябрь 2016" при первом запуске завершился за 30 мин, а при повторном за 24 мин.

Точно так же по остальным месяцам

Да, забыл дать пояснение, Это время при распараллеливании на 10 потоков
15. Иван Филимонов (DarkAn) 360 29.05.17 16:10 Сейчас в теме
(13) Ответ ниже - дал без ссылки на ваше сообщение :)
16. Виталий Барилко (Diversus) 2281 29.05.17 16:30 Сейчас в теме
(15) Почти линейно для 10 потоков... Не плохо...
17. Иван Филимонов (DarkAn) 360 29.05.17 16:43 Сейчас в теме
(16) тут есть одно уточнение... По графикам ниже видно, что распараллеливание не напрямую на 10 потоков идет, а в зависимости от количеств "свободных" документов (если они в графе не зависят от других документов). Более того в обработке отключена процедура "СдвигПоследовательностиВперед" и "пропускаются" приходные документы. За счет этого и достигается ускорение близкое к х10. Если бы база была с 2 поступления на 2 склада по 1-номенклатуре и 10000 документов списания (с этих складов), то тут уже не получилось бы распараллелить больше чем на х2 :).
EMelihoff; kiruha; +2 Ответить
18. kiruha Дронов (kiruha) 360 29.05.17 18:22 Сейчас в теме
Вижу восстановление партий . Но в бух нет партий , а есть последовательности - с измерением Организация и СостояниеПроведения.
Ничего больше нет.
Аналогично в регистре бухгалтерии только Организация. валюта, подразделение - так что и модифицировать последовательность не удасться.
Бухи и так отдельно по организациям перепроводят.
Правильно ли понимаю - что в данном случае (типовые Бух и все что на них) - Ваша обработка никак не поможет ?
19. Иван Филимонов (DarkAn) 360 29.05.17 18:40 Сейчас в теме
(18) На БУ не тестировал, затачивал под УПП. Но суть одна и та же. Типовые метаданные не меняются, добавляется новый общий модуль. Последовательность в УПП тоже только в разрезе "Организаций". Типовой код изменен не значительно, примерно как в "Общей схеме". Также в цикле перебираются документы подаются в "менеджер потоков" - он уже строит по документам зависимость на основании Ресурсов (см. раздел "Расчет ресурсов") - рассчитанных ВАМИ (см. раздел "Обработать события разработчика") и посылает их по потоки. Мое "Восстановление партий" можно рассматривать, как еще один вариант примеров, но у кого-то результат и на нем заработает :). Для БУ - не помню архитектуру, но по прикидкам основное распараллеливание будет по субконто 10/41/43 счетов.
20. Иван Филимонов (DarkAn) 360 29.05.17 18:46 Сейчас в теме
(18) И да, имеется ввиду последовательность, в УПП они называются "ПартионныйУчет" и "ПартионныйУчетБУ"
Прикрепленные файлы:
21. kiruha Дронов (kiruha) 360 29.05.17 18:52 Сейчас в теме
(19)
вариант примеров, но у кого-то результат и на нем заработает :). Для БУ - не помню архитектуру, но по прикидкам основное распараллеливание будет по субконто 10 счета
Не понял. В бухии идут проводки зависящие от других проводок сделанных ранее по организации, с разными счетами и субконто. Не только ресурсы - но счета и субконто. Например - зачет авансов по документу если стоит - будут сформированы проводки по зачету авансов. Не представляю как все это можно распараллелить (в рамках одной организации)
22. Иван Филимонов (DarkAn) 360 29.05.17 18:57 Сейчас в теме
(18) Еще дополню... При расчете "Ресурсов" вы определяете как будет выстраиваться зависимость документов. Можно сделать только по "Складу", тогда все документы у которых один и тот же склад будут выстраиваться в очередь. Можно по склад + номенклатура, тогда документы с одним складом могут проводиться параллельно если у них разный состав номенклатуры. Тут все уже будет зависеть от Вас и потребностей заказчика. Можно например реализовать (бред, но можно), не только по субконто 10/41/43 счетов, а по произвольному другому алгоритму зависимости, например, по году рождения ответственного за документ - если у ответственных за документ один и тот же год рождения, то эти документы проводятся друг за другом, а другие параллельно, но тут уже могут возникнуть блокировки и/или взаимоблокировки накладываемые архитектурными реализациями платформы. Так что распараллеливать надо то - что можно распараллелить.
23. Иван Филимонов (DarkAn) 360 29.05.17 19:00 Сейчас в теме
(21) тут не надо путать теплое и мягкое. Последовательность партий восстанавливается своей обработкой, а последовательность взаиморасчетов своей - ни та ни другая документы не перепроводит. Они двигают свои регистры / счета. Вот в рамках этих обработок и происходит "вклинивание" и описание правил по распараллеливанию.
24. kiruha Дронов (kiruha) 360 29.05.17 19:10 Сейчас в теме
(23)
Вы можете хотя бы схематично/на пальцах описать как для типовой бухгалтерии 3.0 или 2.0 использовать фреймворк ?
25. Иван Филимонов (DarkAn) 360 29.05.17 19:13 Сейчас в теме
(21) Попробую на пальцах объяснить на взаиморасчетах. Есть:
Док1 (Поступление) - Контрагент1, Договор1 5000
Док2 (Поступление) - Контрагент1, Договор2 4000
Док3 (Поступление) - Контрагент2, Договор3 3000
Док4 (Взаимозачет) - Контрагент1, Договор1 / Контрагент2, Договор3 5000 - перенос долго
Док5 (Платежка) Контрагент2, Договор3
Док6 (Платежка) Контрагент1, Договор2

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

Но для ресурсов Вы должны написать свой алгоритм в событии "ПриПолученииМассиваРесурсов".
(Пример взят из головы)
Прикрепленные файлы:
26. Иван Филимонов (DarkAn) 360 29.05.17 19:19 Сейчас в теме
(24) Без проблем:
Создаете общий модуль "МенеджерПотоков" - туда переноситься весь код из модуля объекта - предоставляемой обработки. Затем по рекомендации, создаете еще один общий модуль Имя без разницы (укажите его при Инициализации) с экспортной функцией "ОбработатьСобытиеРазработчика" В этой функции на примере картинки из (http://infostart.ru/public/626117/#Функция «ОбработатьСобытиеРазработчика()») описываете свой код. По обработке документа, расчету ресурсов, получению ответ ну в принципе и все
27. Иван Филимонов (DarkAn) 360 29.05.17 19:22 Сейчас в теме
(24) Как писать код можно посмотреть в домообработках (скачать можно бесплатно). Например в "РЛ-Параллельно (события в произвольном модуле)"
28. Иван Филимонов (DarkAn) 360 29.05.17 19:24 Сейчас в теме
(24) Ваш вариант (если не надо получать ответ от потоков) -

ИначеЕсли РазрезМенеджеров = "РЛ - Зависимость по 1-ой букве (сохраняем на сервере потока)" Тогда
.....
29. Иван Филимонов (DarkAn) 360 30.05.17 09:19 Сейчас в теме
(25) Перепутал местами на скрине 2 и 3 документ
30. Антон Комаров (ardarik) 8 31.05.17 16:30 Сейчас в теме
За что я только что заплатил 10 $m ?!
31. Анатолий Лукьянов (KazanKokos) 9 31.05.17 17:17 Сейчас в теме
(30) еще 10000руб предстоит заплатить чтобы все увидеть :)
32. Антон Комаров (ardarik) 8 31.05.17 17:45 Сейчас в теме
33. Иван Филимонов (DarkAn) 360 31.05.17 18:15 Сейчас в теме
(30) Есть вопросы? Готов ответить.
34. Иван Филимонов (DarkAn) 360 31.05.17 19:33 Сейчас в теме
(30) Завтра, напишу ещё демообработки "по универсальнее" с функцией перезаписи N-элементов произвольного справочника. Предоставив пользователю возможность выбрать справочник, количество потоков и количество перезаписываемых элементов
35. Иван Филимонов (DarkAn) 360 01.06.17 14:47 Сейчас в теме
(30) Добавил новые демообработки, как сообщал ранее.
EMelihoff; +1 Ответить
36. Роман Сюзев (sorb) 07.06.17 23:07 Сейчас в теме
https://github.com/wizi4d/TaskManagerFor1C
Знакомы ли с этой разработкой? Если да, то что в ней не устроило?
37. Иван Филимонов (DarkAn) 360 08.06.17 02:13 Сейчас в теме
(36) А если нет?
Действительно с этой разработкой не знаком, и не смогу сейчас привести примеры отличий. Если Вы с ней знакомы или есть знающий знакомый, можем пообщаться в чате и составить карту отличий (если Вы в этом заинтересованы).

Бегло я попытался поглядеть, что в цф-ке. Но готовых тестовых примеров не нашел, так что сложно оценить "что", "как" и "где" должен писать разработчик работающий с предоставленным Вами модулем.

Могу кратко описать, что может мой модуль:
* Модуль состоит только из одного общего модуля без регистров и перечислений (подглядел в цф-ке)
* Автоматическое построение зависимости объектов для обработки (что позволяет реализовать восстановление партий, о чем говориться в статье);
* отдельно выделенный, от модуля менеджера потоков, модуль(и) разработчика со своими алгоритмами (модуль менеджера может быть без изменений вообще);
* возможность описать код разработчика вне метаданных (в самой внешней обработке), что позволяет их (внешние обработки) писать без изменения конфигурации БД;
* возможность одновременного запуска нескольких менеджеров с разными алгоритмами (В разработке сейчас обсуждается расчет зарплаты, где есть ряд выполняемых операций, при этом есть четкая зависимость одних операций от других, но ряд операций при этом могут выполняться параллельно в одной из веток дерева(графа), а следом идущие операции (этой же ветки), только при завершении всех этих параллельных. При этом каждая операция будет стартовать свой менеджер потоков, который будет распараллеливать выполнение конкретно взятой операции, но это пока в обсуждении, но пока все укладывается в возможности модуля);
* перезапуск ФЗ, в случае вылета;
* ну и еще что-то по мелочи, все возможности описаны в статье :)

Что увидел в описании "TaskManagerFor1C" это ограничение по количеству выполнений одной операции, после чего она считается не выполненной. Такой функционал в моем модуле на сегодня отсутствует, но потребность в нем тоже есть и это уже заложено в следующих обновлениях, как и ряд других идей :)

Если есть конкретные вопросы задавайте
sorb; EMelihoff; +2 Ответить 2
38. Роман Сюзев (sorb) 08.06.17 14:23 Сейчас в теме
(37) Приведенное решение не мое.
Спасибо за краткое описание, собственно и хотелось по-быстрому, не вникая глубоко, понять отличия. Теперь вижу, что стоит изучить подробнее.
В разработке сейчас обсуждается расчет зарплаты

Если не сложно, ткните ссылкой в обсуждение.
Правильно ли я понимаю, что планируются готовые модули разработчика для типовых конфигураций, в частности, для ЗУП?
39. Иван Филимонов (DarkAn) 360 08.06.17 15:03 Сейчас в теме
(38)

Если не сложно, ткните ссылкой в обсуждение.


Обсуждение внутренне, в рамках нашей организации, не для общего использования :)


(38)
Правильно ли я понимаю, что планируются готовые модули разработчика для типовых конфигураций, в частности, для ЗУП?

Не совсем :) Я выкладываю только модуль позволяющий производить распараллеливание. А разработчик/разработчики разрабатывают вторую часть которая опирается на модуль. По аналоги с 1С. Я предоставляю платформу (мой модуль), а разработчики пишут свое отраслевое решение (модули с обработчиками событий под конкретные задачи). Так что вопрос о разработке модулей для типовых конфигураций я отдаю на волю разработчикам :)

Разработчик (фриланс / франч) берет модуль для разработки (с закрытым кодом) добавляет свой модуль с обработкой событий и выставляет конечному клиенту(ам). Под каждую разработку отдельное приобретение, но на неограниченное количество поставок клиентам.
Или
Конечный пользователь приобретает модуль (с открытым кодом) и использует его как хочет на неограниченное количество проектов в рамках своей организации .
40. Иван Филимонов (DarkAn) 360 08.06.17 15:23 Сейчас в теме
(38)
Теперь вижу, что стоит изучить подробнее.

В ближайшее время выложу дополнительные картинки с разъяснением расчета ресурсов, при каких условиях как строится граф, а то пишут, что это достаточно сложная часть и демо примера - мало :)
41. Иван Филимонов (DarkAn) 360 09.06.17 12:08 Сейчас в теме
(38) Добавил картинки (разъяснения) по формированию ресурсов
EMelihoff; +1 Ответить
42. Ольга Петровская (pt_olga) 62 18.07.17 11:49 Сейчас в теме
эпохальный труд! респект!
Darklight; igo1; support; +3 Ответить 1
43. Иван Филимонов (DarkAn) 360 18.07.17 13:38 Сейчас в теме
(42) Спасибо за отзыв!
Эпохальным он станет, если им начнут пользоваться - эпохально :)
igo1; pt_olga; raiml; +3 Ответить
44. Артем Бардюг (Йожкин Кот) 1038 28.07.17 13:35 Сейчас в теме
Если бы вложили готовый модуль для встраивания в БП3 - цены бы Вам не было! Но и без этого - несомненный плюс!
45. Иван Филимонов (DarkAn) 360 28.07.17 14:40 Сейчас в теме
(44) Готовый модуль чего? Восстановления партий? т.к. именно его тут нет :). Честно подумывал над этим, но я проводил оптимизацию под УПП 1.3, и под условия нашей организации. А в других организациях могут быть свои условия, потребности и доработки. Кроме того в моих алгоритмах использованы не все возможности распараллеливания, например, у нас нет характеристик, и их я не встраивал в алгоритмы событий, а у кого то они могут быть в данном случае мой алгоритм будет снижать возможность распараллелить проведение и так далее.

Хотя если будет заинтересованность, наверное выложу, как пример :)
46. Иван Филимонов (DarkAn) 360 28.07.17 14:56 Сейчас в теме
(44) Более того... Разработку таких модулей (обработчиков событий) я предлагаю сообществу.


PS Да, да, знаю, что защита примитивна. Но хоть что-то :) Если вы планируете делать разработку с поддержкой многопоточности на основе данного модуля и предлагать ее потенциальным покупателям, то уповаю на Ваше благоразумее в плане приобретения полной версии. Если Вы являетесь конечным покупателем, то для Вас одно приобретение для одной организации, на неограниченное количество проектов. Если фриланс/франчайзи :), то одно приобретение на один проект (обработку), но на неограниченое количество конечных пользователей.
47. Олег Николаев (o.nikolaev) 192 03.08.17 12:12 Сейчас в теме
Статья отличная, но орфографические ошибки просто убивают всякое желание продолжать чтение. Исправьте! Есть же Word в конце-концов!
48. Иван Филимонов (DarkAn) 360 04.08.17 00:08 Сейчас в теме
(47) Большое спасибо за замечания. Основная часть стать была написана в Word (я бы не осилил написать столько, с таким «незначительным» количеством ошибок :)). БОльшая часть ошибок была допущена в результате правки и обновления разделов, их увы делал на «коленке».

Что нашел - поправил, надеюсь стало лучше.
49. Сергей Толмачев (sss999) 35 10.08.17 00:12 Сейчас в теме
а можно отдельную статью только кратко и с простыми примерами?)в раза 6 кратче )
оч тяжело читать и сразу все механизмы описывать наверно нет смысла, для меня лично, но труд как сказали эпохальный , выглядит слишком зло.
50. Иван Филимонов (DarkAn) 360 11.08.17 09:33 Сейчас в теме
(49)
Если кратко, то что оставить? Если написать в 6 раз меньше, то надо выкинуть 5/6 статьи.

Для «простоты», что требуется от разработчика - скачайте демообработки, а именно «Запись справочников», а в нем Вас будет интересовать – модуль формы и модуль объекта, а именно Функция «ОбработатьСобытиеРазработчика». Под условием:
"Если РазрезМенеджеров = "Запись справочника - Независимая запись" Тогда"
Это САМЫЙ простой способ распараллелить :)

Под условием:
ИначеЕсли РазрезМенеджеров = "Запись справочника - Зависимость по четности кода" Тогда
Это САМЫЙ простой способ распараллелить при выстраивании зависимости объектов :)

Получилось в 6 раз короче??? В данном случае придется самому пытаться понять, как оно устроено - зато кратко. Будут вопросы - обращайтесь к данной статье.

Основные сложности и прочие события реализованы для получения ответов от потоков на клиент. А так же предоставляют возможность собирать информацию для отчетов в момент работы.
51. Сергей Толмачев (sss999) 35 11.08.17 18:41 Сейчас в теме
(50)
Как запустить ,примеры что можно запустить, например обмен какой-то или отчёт..
https://infostart.ru/public/182139/ это тоже что и у вас или нет?
Я вот не помню видел вроде как можно запустить отчет в отдельном потоке и свернув его например делать дальше работу.
52. Иван Филимонов (DarkAn) 360 12.08.17 18:04 Сейчас в теме
(51) Самый простой способ опробовать:
* Скачиваем "Универсальный «Менеджер потоков Демо»";
* Скачиваем демообработки;
* Устанавливаем "Менеджер потоков" на любую конфигурацию
* Запускаем демо обработки, где от разных настроек обработок будут разные результаты. (Формирование расчетных листов оттестировано только на УПП 1.3, возможно будет работать в ЗУП, но под рукой не было - не проверил).


Это самый простой способ распараллелить, и не самый оптимальный. Его основные минусы:
* Необходимо обдумывать как разбить обрабатываемый массив на части (порции) (В предоставленной статье порция - это склад).
*
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);
тут узкое место в том, что пока ПАЧКА фоновых заданий не отработает полностью новое не запуститься. Если в первую выборку попадет один гигантский склад и 9 маленьких, но при этом в общей выборке их предположи 11, то последний 11 склад будет ждать завершения всего блока, ходя 9 потоков по сути будут давно свободны.
* Не реализована обратная связь между потоками и клиентом, хотя допил не большой,
* И САМОЕ ГЛАВНОЕ, если в потоке произойдет ЛЮБАЯ ошибка, хоть ожидание захвата таблицы, он просто прекратит свою жизнь, и Вам ни как об этом не сообщит

В текущем "менеджере потоков" это все учтено. :)

Максимально близкое решение предоставили на (36), но отличия, бегло обнаруженные, я так же описал в (37)
Оставьте свое сообщение