Многопоточное выполнение процедуры с помощью ДлительныеОперации

26.02.23

Разработка - БСП (Библиотека стандартных подсистем)

В публикации: Приведен шаблон для запуска многопоточной операции для различных вариантов размещения многопоточной операции, в том числе в модуле объекта внешней обработки, встроенной в справочник Дополнительные отчеты и обработки; Представлен вариант корректного отображения прогресса многопоточной операции; Приведены замеры, демонстрирующие целесообразность использования нового механизма для увеличения производительности.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Многопоточное выполнение процедуры
.epf 15,65Kb
53
53 Скачать (1 SM) Купить за 1 850 руб.

Введение

Недавно столкнулся с необходимостью увеличить скорость работы одной внешней обработки. Оказалось, что начиная с версии БСП 3.1.6 появился новый функционал. 

Новые возможности для разработчиков в версии 3.1.6

Базовая функциональность

  • Для ускорения выполнения длительных операций предусмотрена возможность выполнить обработчик длительной операции в несколько потоков. Для этого необходимо:
    • Разделить данные на наборы, где каждый элемент набора будет обработан в отдельном фоновом задании.
    • Из программного интерфейса общего модуля ДлительныеОперации для запуска процедуры длительной операции вызвать функцию ВыполнитьПроцедуруВНесколькоПотоков (или ВыполнитьФункциюВНесколькоПотоков), передав третьим параметром сформированный набор данных. Подробное описание параметров см. в комментарии к этим функциям.
    • Максимально допустимое количество одновременно работающих фоновых заданий может быть задано администратором в разделе Администрирование - Общие настройки - Производительность
    • В файловой информационной базе и при работе в модели сервиса длительные операции всегда выполняются в один поток.
    • Пример см. в демонстрационной конфигурации в форме ЗагрузкаАдресногоКлассификатора регистра сведений АдресныеОбъекты.

В описании функции ВыполнитьПроцедуруВНесколькоПотоков (или ВыполнитьФункциюВНесколькоПотоков, но для удобства не буду разделять) описано, что код который будет выполняться в фоне должен быть в:

  1. В общем модуле ("МойОбщийМодуль.МояПроцедура")
  2. Модуле менеджера объекта ("Отчет.ЗагруженныеДанные.Сформировать")
  3. Модуле обработки ("Обработка.ЗагрузкаДанных.МодульОбъекта.Загрузить")

Но мне нужно было запустить процедуру модуля объекта внешней обработки, встроенной в справочник Дополнительные отчеты и обработки. В данном контексте я вспомнил про процедуру ВыполнитьПроцедуруМодуляОбъектаОбработки, что натолкнуло на мысль о том, что есть явно неописанная возможность многопоточно запустить код находящийся в модуле объекта дополнительной обработки, если в качестве первого параметра в функцию ВыполнитьПроцедуруВНесколькоПотоков передать Выполнить ПроцедуруМодуляОбъектаОбработки. Однако при первой попытке реализовать данный вариант я столкнулся с непониманием к ак правильно передать параметры, примеров такого использования функции не нашел, поэтому появилась идея разобраться и опубликовать результаты.

Цели

Перед тем как приступать к реализации, поставим цели, которых хотим достичь в рамках публикации.

  1. Публикация должна ответить читателю на ряд вопросов:
  • Как многопоточно запустить процедуру расположенную в серверном общем модуле?
  • Как с помощью ДлительныеОперации запустить процедуру модуля объекта внешней обработки?
  • Как многопоточно запустить процедуру модуля объекта внешней обработки?
  • Как отобразить прогресс многопоточной операции?
  1. В публикации должны быть продемонстрированы замеры производительности в зависимости от кол-ва потоков, наглядно показан выигрыш в производительности

Цели поставлены, приступим к реализации.

Реализация

Разработка проводилось на демонстрационной базе БСП версии 3.7.1.327. 

Начнем с краткого описания того, что будет делать наша обработка:

  1. Получаем выборку ссылок на N-ое кол-во документов _ДемоПоступлениеТоваров
  2. Разбиваем ее на порции размером N/k, где k - кол-во потоков
  3. Формируем структуры параметров для функции ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков
  4. Запускаем длительную операцию которая поменяет в каждом обрабатываемом документе значение реквизита Комментарий

 

Форма обработки

 

 

Модуль объекта

 

Процедура ниже будет запускаться многопоточно

 
Модуль объекта

 

Модуль формы

 

Первым делом ответим на вопрос "Как в длительной операции запустить процедуру модуля объекта внешней обработки?":

 
Как с помощью ДлительныеОперации запустить процедуру модуля объекта внешней обработки?

 

И реализуем базовую функциональность для отображения прогресса

 
 Прогресс
 

Теперь ответим на вопрос "Как многопоточно запустить процедуру модуля объекта внешней обработки?" и "Как многопоточно запустить процедуру расположенную в серверном общем модуле?": 

 
 Многопоточный запуск
 

Однако есть проблема - прогресс для многопоточной операции будет крайне неинформативным. Поясню, когда запускаем многопоточную длительную операцию, сначала запускается основной поток, который в свою очередь запускает нужное нам кол-во потоков

 

 

Как я понял основной поток передает только информацию о завершении дочерних потоков, а в силу того что данные разбиваются на равные порции, и потоки заканчиваются практически одновременно, прогресс бар в какой-то момент просто скаканет с 0 до 100. Необходимо каким-то образом синхронизировать прогрессы обработки в каждом потоке и выдать пользователю среднее значение. Типового функционала который в полной мере будет делать то, что описано я не нашел. Но в рамках многопоточного выполнения длительной операции есть несколько моментов, которые могут помочь реализовать собственный функционал:

1. В процедуру  ПрогрессВыполнения попадает структура длительной операции (см. ДлительныеОперацииКлиент.ПараметрыОжидания) и что важно - в ключе ИдентификаторЗадания этой структуры, содержится именно идентификатор основной длительной операции.

2. Есть функция СерверныеОповещения.СерверныеОповещенияДляКлиента благодаря, которой можно получить все сообщения о прогрессе из потоков, по идентификатору основного потока . А имея эти оповещения остается правильно их обработать.

Синтезируем из этих фактов процедуру которая корректно отображать прогресс многопоточной операции, а если точнее подправим процедуры ПрогрессВыполнения и ПрочитатьПрогресс:

 
Улучшенный прогресс

 

Полный код модуля формы

 

 
 Полный код модуля формы

 

Замеры производительности

 

Были произведены замеры производительности в зависимости от кол-ва потоков. Результаты для разного кол-ва обрабатываемых документов на графиках

  

  

 

 

Из графиков видно, что вне зависимости от кол-ва обрабатываемых документов, использование даже двух потоков на данном конкретном примере дает выигрыш в производительности примерно в 2 раза.

 

Выводы

 

В публикации:

  • Приведен шаблон для запуска многопоточной операции для различных вариантов размещения многопоточной операции, в том числе в модуле объекта внешней обработки, встроенной в справочник Дополнительные отчеты и обработки;
  • Представлен вариант корректного отображения прогресса многопоточной операции;
  • Приведены замеры, демонстрирующие целесообразность использования нового механизма для увеличения производительности.

 

P.S.

 

  • Еще публикации по теме:

Многопоточный режим выполнения процедуры с помощью методов БСП - примеры разработки

Гарантированно рабочий пример использования длительных операций на БСП с отображением прогресса. [Часть 1]

Многопоточность как способ ускорения некоторых процедур

Как ускорить 1С – Многопоточная обработка данных

  • Многопоточность работает только в клиент-серверном варианте работы
  • Обратите внимание на константу Кол ичествоПотоковДлительныхОпераций, по умолчанию значение 0 и больше 3 потоков запущено не будет. (см. ДлительныеОперации.ДопустимоеКоличествоПотоков)
  • Весь код по теме представлен в публикации, в приложенной обработке реализован тестовый стенд для этой статьи с замерами времени, построением по ним графика и тп

 

 

 

Многопоточно ДлительныеОперации ДлительныеОперации.ВыполнитьПроцедуруВНесколькоПотоков ДлительныеОперации.ВыполнитьФункциюВНесколькоПотоков ВыполнитьПроцедуруМодуляОбъектаОбработки прогресс распараллеливание фоновые задания БСП

См. также

БСП (Библиотека стандартных подсистем) Программист Платные (руб)

Синтакс-помощник БСП - cправочник по библиотеке стандартных подсистем. В состав справочника входит описание экспортных процедур и функций, размещенных в областях кода ПрограммныйИнтерфейс БСП.

1800 руб.

21.11.2024    2356    8    14    

8

БСП (Библиотека стандартных подсистем) Программист Бесплатно (free)

Синтакс-помощник БСП - справочник по Библиотеке Стандартных Подсистем, профессиональный инструмент разработчика с интуитивно понятным интерфейсом. Читайте в статье как использовать все возможности справочника и сделать работу с БСП более комфортной и эффективной.

11.12.2024    3046    gorenski    0    

8

БСП (Библиотека стандартных подсистем) Менеджеры внешних отчетов Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление холдингом Абонемент ($m)

За последние лет 5 несколько раз сталкиваюсь с проблемой на разных проектах (в конфигурациях 1С:ERP, 1С:ERP УХ и многих других, основанных на БСП), когда много пользователей (около 30 тысяч) в информационной базе, время добавления доступа для пользователей занимает значительное время. Открытие списка занимает от 10 до 15 секунд, и каждое изменение списка еще примерно столько же.

1 стартмани

10.12.2024    624    Iaskeliainen    2    

7

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Некоторые нюансы, если вы захотите создавать свои расширения. Доработка отчета "Связанные документы" для отражения документов расширения. Печатные формы с шаблоном Word.

20.11.2024    2890    milkers    3    

9

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1396    PROSTO-1C    0    

16

БСП (Библиотека стандартных подсистем) Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    1194    PROSTO-1C    4    

14

БСП (Библиотека стандартных подсистем) Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В статье рассмотрим пошаговую инструкцию создания дополнительного отчета с фоновым формированием результата.

04.10.2024    2082    MadRave    11    

24
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Sergant 54 27.02.23 11:40 Сейчас в теме
Запуск потока в голанг - go ИмяФункции().
А теперь живите с этим. :)
SquizzyMan; +1 2 Ответить
6. alex_sayan 53 27.02.23 15:43 Сейчас в теме
(1) в голанге многопоточно шло из коробки. А сами потоки очень легковесные. Тут как бы и сравнивать даже некорректно
7. Sergant 54 27.02.23 15:45 Сейчас в теме
(6) Как бы сравнивать корректно, некорректно - утюги с пирогами. 1С унылый малопоточный тормоз.
20. JohnyDeath 302 03.03.23 15:07 Сейчас в теме
(7) вы, наверное, и на форум ГО-разработчиков заходите в тему, где они создают таблицы БД с индексами и формы списков и объектов к ним, контроль целостности и т.п. а потом добавляете комментарий:
"В 1с достаточно добавить Справочник в метаданные. Живите теперь с этим!"
;)
medexe; annak2980; dobrynin.i.s; brr; +4 Ответить
21. Sergant 54 03.03.23 15:27 Сейчас в теме
(20) А также они не имеют такого классного конструктора запросов или СКД. И поверьте - явашники и гошники, бывшие 1Совыцы, очень сильно страдают.
14. more 17 01.03.23 10:29 Сейчас в теме
(1)А не похоже ли это на человека, который сравнивает велосипед с бульдозером? типа "Велосипед транспорт и ехать на нем можно и через подземный переход на нем можно, а бульдозер ничего из этого не умеет. Вот и живите с этим. :)"
Может быть вы сможете написать ERP на вашем голанг и мы посмотрим как это получится? Ну а что, вдруг будет лучше - и весь мир перейдет на вашу ERP, Станете богатым человеком. Я придерживаюсь такого мнения - есть конструктивная идея - пишем разработчику продукта (в нашем случае 1С). Есть новый функционал в 1С, ознакомились - сказали спасибо, и пошли дальше (работать, зарабатывать, внедрять один из лучших бизнес продуктов на нашем рынке)
Olenevod; JohnyDeath; sa1m0nn; serg_gres; nyam-nyam; +5 Ответить
15. Sergant 54 01.03.23 11:23 Сейчас в теме
Могу лишь повторить - 1С унылый малопоточный тормоз (признать неприятно некоторым). Go язык - быстродействие и многопоточность это его ДНК. Сравнивать могу, как может сравнить экскаваторщик на чем ему быстрее будет добраться домой на обед - на велосипеде или на экскаваторе). Мои слова не отменяют великолепие 1С в части быстрой разработки бизнес приложений.
16. Sergant 54 01.03.23 19:23 Сейчас в теме
После таких кто говорит про некорректность сравнения потом другие переписывают весь код или уходят к другим вендорам. Salesforce: Why we ditched Python for Google's Go language in Einstein Analytics.
23. siamagic 13.03.23 11:53 Сейчас в теме
(1)Для внешнее обработки 2 строчки на клиенте, 4 на сервере. Если убрать вызов с клиента и сильно захотеть то будет две строки на сервере.
Живи с этим.
31. user2112259 01.11.24 13:54 Сейчас в теме
(1) И что с того?
Когда на голанге будет хотя бы бухгалтерия с поддержкой законодательства тогда и будет смысл хвастаться, а пока ваш голанг очередная поделка без практической пользы для того же бухгалтера :)
2. ImHunter 328 27.02.23 12:31 Сейчас в теме
(1) ФоновыеЗадания.Выполнить("ИмяМетода") - не сильно сложнее.
Автор таки по-сложнее кейс реализует.
корум; SnubbyAston; +2 1 Ответить
4. Sergant 54 27.02.23 14:03 Сейчас в теме
(2) Так и знал что это скажут.
А перед вызовом сколько кода написано? На уровне днк языка или общих модулей :)
О тот как через сообщения пользователя 1С кидает уведомления о прогрессе выполнения задания - я молчу. Меня чуть не стошнило.

Работаем товарищи. Все что не может платформа 1С - Будем делать мы!
3. KUAvanesov 27.02.23 13:20 Сейчас в теме
(1) ну там еще синхронизация через каналы, мьютексы итп. Не так уж и просто все.
Но то что GO запустит 100500 горутин и не помрет а 1с 8-10 и больше не стоит - это факт).

PS все же хорошо, что 1с в бсп реализует то, что раньше приходилось писать самостоятельно, значит прислушиваются, присматриваются к коду, который пишут на 1с. Я вот уже привык использовать длительные операции, с отладкой удобно же сделали через "/РежимОтладки".
19. serg_gres 154 02.03.23 12:54 Сейчас в теме
(3)
Но то что GO запустит 100500 горутин и не помрет а 1с 8-10 и больше не стоит - это факт).


Хоть 100500, хоть миллиард, а если действия, которые производятся в фоне связаны с БД,
то 100500 потоков на GO не будут быстрее, чем 1С с ее 10-ю потоками.

Я надеюсь никто ведь не думает, что 100500 потоков GO одномоментно и мгновенно
способны произвести записи в таблицу SQL ?

Если в фоне нужно производить какие-то, например, вычисления в памяти,
то 1С однозначно будет проигрывать, потому что вся ее инфраструктура тяжеловесна
(это и динамическая типизация, и запуск полноценного сеанса в потоке и т.д. и т.п.).
Но таких задач в среде 1С не особенно то часто и бывает,
поэтому то, что сейчас реализовано в 1С - в максимальной степени отвечает сфере применения платформы.
И в этой среде конкуренты не то что лучше, они хуже 1С по совокупности параметров.
30. KUAvanesov 22.08.24 12:19 Сейчас в теме
(19) Не всегда нам надо что писать в БД. Иногда нужно сходить в 3-5 api и получить ответы. Скомпоновать и отдать пользователю.

Разработчик 1С скорее всего при реализации такой задачи будет ходить последовательно в каждый сервис.

А на Go можно запустить параллельно и остаться ждать всех результатов.
5. ImHunter 328 27.02.23 14:10 Сейчас в теме
(4) Нутк и сравнивать горутины с фоновыми заданиями 1С - мягко говоря, некорректно. Да, легкого аналога горутин в 1С нет.
8. alexey_kurdyukov 168 27.02.23 18:02 Сейчас в теме
А почему два потока в три раза быстрее одного? Я ожидал прирост где-то в 1.8.
starik-2005; echo77; +2 Ответить
10. starik-2005 3092 28.02.23 15:42 Сейчас в теме
(8)
А почему два потока в три раза быстрее одного?
Я вообще ожидал в 18 раз, но математика - не мое )))
egoriy111; +1 Ответить
11. alexey_kurdyukov 168 28.02.23 15:44 Сейчас в теме
(10) да почему в три раза-то, должно быть какое-то объяснение!
12. egoriy111 96 28.02.23 20:12 Сейчас в теме
(11)
на данном конкретном примере

Из возможных причин почему 3, хотя я тоже ожидал в районе двух: хороший сервак, с 12-ти ядерным процессором, на сервере работало в момент тестов 1,5 пользователя включая меня. Как именно там распределилась нагрузка - не знаю. Но есть куда копать
9. echo77 1908 27.02.23 19:50 Сейчас в теме
13. alexey_kurdyukov 168 01.03.23 03:13 Сейчас в теме
Можете повторить замеры, добавив выполнение работы синхронно, в том же потоке, без заданий?
egoriy111; +1 Ответить
17. egoriy111 96 01.03.23 20:48 Сейчас в теме
(13) Спасибо за идею, почему то такая очевидная вещь в голову не пришла) Действительно, правильнее сравнивать выполнение без фона, с 2мя и большим кол-вом потоков. Я запустил код для 1000 документов без фона и получил время выполнения 1.32 мин, это уже ближе к тому что ожидалось. Сделаю замеры для других и поправлю графики
18. ImHunter 328 02.03.23 10:05 Сейчас в теме
(14) Больше похоже на сравнение электросамоката с электропогрузчиком. Да, технически, можно что-то посравнивать. Но, практически, в таком сравнении нет никакого смысла.
22. soldatof 07.03.23 11:47 Сейчас в теме
А как же ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне ? Кажется еще с БСП 3.1.4 есть.
25. dobrynin.i.s 92 31.01.24 07:54 Сейчас в теме
(22)
ВыполнитьКомандуВФоне
в другой статье автора https://infostart.ru/1c/articles/1318934/
написано: "Согласно последним рекомендациям БСП (версия 3.1.3.303) предлагается использовать более современные функции для работы с длительными операциями - это ВыполнитьПроцедуру и ВыполнитьФункцию."
24. Quantum81 6 12.04.23 11:23 Сейчас в теме
Огонь!
Стеб с GO считаю оправданным, т.к. уже пора все это выносить в платформу, а не колхозить на базе фоновых. Имхо.
26. ER34 28 15.03.24 18:15 Сейчас в теме
Ошибка инициализации модуля: ВнешняяОбработка.ВнешняяОбработкаМногопоточно.Форма.Форма.Форма
по причине:
{ВнешняяОбработка.ВнешняяОбработкаМногопоточно.Форма.Форма.Форма(379,21)}: Переменная не определена (СерверныеОповещения)
МассивОповещений = <<?>>СерверныеОповещения.СерверныеОповещенияДляКлиента(ИдентификаторЗадания);

ERP 2 (2.5.8.342)
27. isn 15 19.04.24 12:50 Сейчас в теме
(26) в 1С:ERP. Управление холдингом (3.1.12.11) есть точно. Правильно ли вызов размещен? я в ручную обработку собирал по статье у меня ошибок нет, кроме отсутствие процедуры в самой статье "ПроцедураВМодулеОбъекта()".
28. isn 15 22.04.24 16:56 Сейчас в теме
в БСП версии 3.1.7.526 в процедуре СерверныеОповещения.СерверныеОповещенияДляКлиента(ИдентификаторЗадания) не хватает переменных.
Вторым параметром идет ВидОповещения, он может принимать значения указанные внизу или неопределено.
Если ВидОповещения = "СообщениеПользователю" Или ВидОповещения = "Сообщения" Тогда
Возврат Новый УникальныйИдентификатор("0afef160-bfcb-459e-a890-a4afbb73b7ba");

ИначеЕсли ВидОповещения = "Прогресс" Тогда
Возврат Новый УникальныйИдентификатор("14076bb1-a1f5-4876-975a-3b7f69383f6c");

ИначеЕсли ВидОповещения = "ДлительнаяОперацияЗавершена" Тогда
Возврат Новый УникальныйИдентификатор("28e5ab5c-196b-44be-aab5-8fe7edb5225b");
КонецЕсли;
29. Serg2000mr 743 12.05.24 22:16 Сейчас в теме
(0) Кнопка Поменять комментарии без многопоточности выдает ошибку. Отсутствует поле Параметры.ВсегоПотоков
32. Saipl 7 24.11.24 09:44 Сейчас в теме
Всё хорошо, только почему-то не отображается индикатор процесса, только после завершения задания 100%.
1С:Предприятие 8.3 (8.3.25.1394)
Розница, редакция 3.0 (3.0.9.163)
Описание.Имя = "СтандартныеПодсистемы";
Описание.Версия = "3.1.10.308";

И судя по списку фоновых заданий выполняется не в 8 потоков которые были заданы.
Прикрепленные файлы:
Оставьте свое сообщение