Использование COM-объектов в OneScript

  оглавление  Подсказки по настройке sql-архивов

Многопоточное выполнение операций над базами 1с в обновляторе

Введение

Друзья, я рад сообщить вам, что в обновляторе, наконец, появилась полноценная многопоточность при выполнении операций над базами  :-)

Ещё год назад, когда меня спрашивали о многопоточности и перспективах её появления, я только разводил руками и был уверен на все 100%, что возможности этой в программе не появится никогда, так как обновлятор изначально не был спроектирован для этого.

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

Я предварительно заручился результатами голосования в группе обновлятора. В этом голосовании приняло участие не так много пользователей (88 человек), но половина из них высказалась за добавление возможности параллельного выполнения операций над базами.

И вот эта возможность готова и в этой статье я расскажу как ею пользоваться. Сразу оговорюсь, что многопоточность работает только в проф-версии программы, иначе её включение свело бы на нет весь смысл ограничений бесплатного обновлятора.

Как включить параллельное выполнение операций?

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

Чтобы включить её зайдите в дополнительные настройки обновлятора:

В открывшемся окне перейдите на закладку "Многопоточность":

Здесь настройте количество потоков (количество баз, операции над которыми будут выполняться параллельно) для ручного запуска операций.

Также я советую поставить галку "Показывать окно выбора количества потоков...".

Тогда, если вы будете удерживать клавишу Ctrl при запуске любой операции появится диалог...

... в котором вы сможете переопределить количество потоков по умолчанию.

Как настроить запуск в несколько потоков для задачи по расписанию

Количество потоков для задач, запускаемых по расписанию, настраивается прямо в самой задаче:

Пример запуска операции в несколько потоков

Вот как будет выглядеть, к примеру, запуск архивации 4 баз в 2 потока:

Вы видите, что справа от вкладки "Отчет" появились 2 дополнительные вкладки "Поток #1" и "Поток #2".

В этих вкладках содержатся отчёты по операциям над базами каждого из потоков:

В конечном итоге полный отчёт обо всех операциях в потоках собирается и доступен на вкладке "Отчет":

В процессе выполнения потоков вы можете следить за их прогрессом сразу в двух местах.

Во-первых, на вкладке самого потока:

Во-вторых, на вкладке "Отчёт":

Пример запуска скрипта в несколько потоков

Операции, запускаемые на закладке "Скрипты", можно также выполнять в несколько потоков:

Для ручного запуска скрипта в несколько потоков удерживайте клавишу Ctrl, когда нажимаете кнопку "Запустить". Появится окно выбора количества потоков. Но чтобы этот способ сработал, у вас должна стоять галка "Показывать окно выбора количества потоков..." на закладке "Многопоточность" в дополнительных настройках обновлятора.

Если же речь идёт о запуске скриптов по расписанию, то здесь количество потоков выбирается в диалоге сохранения скрипта:

Ограничения

Многопоточность не работает в клонах, так как клон на самом деле уже является одним из потоков обновлятора.

Многопоточность не работает при запуске операции обновления с расширенными параметрами (в будущем вероятно доработаю и эту возможность):

Предостережения

Я хочу предостеречь вас от использования многопоточности, если у вас достаточно большое технологическое окно и все операции над базами укладываются в него и при последовательном выполнении (то есть в 1 поток).

Механизм многопоточности подразумевает управление и синхронизацию потоков, которые на самом деле (см. ниже) являются отдельными экземплярами обновлятора.

Цикл многопоточного выполнения операций технически сложнее, а вероятность возникновения ошибок и проблем выше.

Поэтому первое, о чём я буду спрашивать пользователя, который написал мне о проблеме при многопоточном выполнении операции: "А повторяется ли ошибка при выполнении без многопоточности?"

Но, если увеличение производительности при выполнении операций вам действительно необходимо, смело используйте многопоточность.

При этом увеличение количества потоков должно быть разумным и обоснованным из-за физических ограничений самого оборудования (жесткий диск, процессор, память). Соответственно чем круче у вас железо, тем больший выигрыш даст параллельность. Если же у вас среднестатистический компьютер, то не имеет смысла запускать обновление более чем в 2-3 потока, иначе параллельное выполнение операций может получиться дольше последовательного.

Технические подробности

Для того, чтобы запустить отдельный поток, обновлятор:

  • копирует все свои текущие настройки в отдельную папку потока Data/Threads/ID
  • выделяет для текущего потока соответствующее количество баз для обработки (все базы, над которыми выполняется операция, разбиваются равномерно между доступными потоками перед их запуском)
  • сохраняет текущие параметры запуска операции во внешний файл
  • запускает отдельный процесс обновлятора в специальном режиме (упрощается интерфейс, оставляется только вкладка "Отчет")
  • запущенный процесс обновлятора (он называется Updater1C.Clone.exe) встраивается в закладку главного обновлятора

Получается, что каждая отдельная закладка потока в главном обновляторе по сути является отдельным приложением и выполняется в отдельном процессе (Updater1C.Clone.exe). Это можно сравнить с тем, как при работе браузера Chrome каждой закладке соответствует отдельный процесс Chrome.exe.

При этом у каждого из потоков своя папка Temp, которая всегда расположена внутри папки потока.

Зачем нужно клонирование

Возможность клонирования обновляторов никуда не уходит, так как она органично дополняет многопоточность.

Я вижу, например, такой сценарий использования клонирования:

  1. У нас уже выполняются какие-то операции над базами в обновляторе (не важно в один или несколько потоков)
  2. Нам понадобилось выполнить или другой вид операции или ту же операцию над новой базой.

И вот здесь нам как раз будет полезна возможность запустить новый экземпляр обновлятора (или несколько) и выполнить в нём все необходимые операции:

Подведём итог.

Если мы хотим запустить одну и ту же операцию над группой баз в параллельном режиме, нас выручит многопоточность. Если же мы хотим запустить одновременно разные операции над разными базами, то здесь нас выручит клонирование.

По любым вопросам, связанным с обновлятором, пишите мне на почту helpme1c.box@gmail.com

С уважением, (преподаватель школы 1С программистов и разработчик обновлятора).



Владимир Милькин
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Нажмите одну из кнопок, чтобы поделиться:



Использование COM-объектов в OneScript

  оглавление  Подсказки по настройке sql-архивов