Многопоточность. Универсальный «Менеджер потоков» 2.0

Администрирование - Оптимизация БД (HighLoad)

126
Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

Все, что было в первой версии, переработано, улучшено и дополнено. В связи с чем она (первая версия) переходит в разряд статьи с основными объяснениями и картинками.

Сразу договоримся, если в тексте будет указано «v1» - это отсылка к реализации в первой версии, если «v2» - к текущей.

Очень кратко, о чем речь…

Фреймворк в виде одного общего модуля, позволяющего при получении объектов на обработку запускать их в несколько потоков. Особенности:

  • Нет необходимости рассчитывать «порции» для обработки;
  • Нет необходимости организовывать файловый обмен между потоками;
  • Возможность запускать несколько менеджеров потоков одновременно, при этом потоки одного менеджера, могут запускать новые менеджеры со своими задачами и потоками (главное чтоб лицензий хватило :));
  • Можно выстраивать граф зависимости объектов, что позволяет, например, избегать взаимоблокировок и/или организовать восстановление партий (на нашем предприятии удалось добиться 10х+ ускорения при 10 потоках в рабочее время – 200+ активных пользователей - Результаты работы механизма);
  • Все необходимые "вмешательство" в алгоритмы происходят с помощью событий;
  • Возможность описывать алгоритмы событий, как в модуле менеджера, так и в любом другом модуле БД (предпочтительно), а также во внешней обработке.
  • Автоматический рестарт потока в случае ошибок;
  • Контроль за количеством рестартов по каждому объекту;
  • Возможность получать «ответы» от потоков;
  • Возможность контролировать работу с помощью «Инструментов разработчика» или иных отчетов;
  • Возможность срочного прерывания работы;
  • И многое другое…

так было в «v1»

 

Основные изменения v2:

  • Только полная версия, полностью открытый код;
  • Практически полностью переписано ядро и архитектура (кода стало на ~50% больше), механизм обмена данными остался тот же (Хранилище общих настроек);
  • Появилось 3 способа обработки:
    • Обработка поэлементно:
      • Процедура ОбработатьОбъект(); (реализовано v1)
    • Обработка коллекций:
      • Процедура ОбработатьКоллекцию();
      • Процедура ДополнитьКоллекцию ().
  • Скорость обработки «зависимых» объектов происходит быстрее на 5-15% по сравнению с «v1», при выполнении одной и той же задачи;
  • Появилась возможность передавать в потоки произвольные единожды сформированные данные или рассчитывать их при запуске потока.
  • Возможность получать «ответ» об обработке объекта(ов) в «реальном времени» (в «v1» приходилось дополнительно прописывать обвязку из временного хранилища с помощью «СобытийРазработчика», откуда данные можно было получить только в конце обработки);
  • Сообщения выведенные в потоках, теперь выводятся автоматически (в «v1» приходилось обрабатывать через «Событиях разработчика»);
  • Расчет ресурсов теперь выполняют потоки;
  • Изменен состав «Событий разработчика»;
  • Изменена структура параметров передаваемых в «События разработчика»;
  • Граф теперь является одним объектом (в «v1» он состоял из нескольких не связанных объектов, что могло вызвать затруднения в понимании работы);
  • Расширены собираемые данные для анализа работы менеджера потоков (до 11 показателей);
  • Предоставлен шаблон функции «ОбработатьСобытиеРазработчика» для своих модулей;
  • В статью добавлены примеры;
  • Прочие мелочи.

Теперь обо всем по порядку в деталях и с картинками...

 
 
 Архитектура
 
 Способы обработки
 
 
 Параметры инициализации
 
 События разработчика
 
 Мониторинг
 
 Примеры работы и выводы

 

126

Менеджер потоков

Наименование Файл Версия Размер
Многопоточность. Универсальный «Менеджер потоков» 2.0 + Интерактивная остановка менеджеров потоков:
.zip 31,42Kb
09.02.18
37
.zip 2.0.4 31,42Kb 37 Скачать

Обработки

Наименование Файл Версия Размер
Обработка с примерами из статьи
.epf 13,72Kb
07.02.18
20
.epf 13,72Kb 20 Скачать
Интерактивная остановка менеджеров потоков
.epf 10,67Kb
07.02.18
13
.epf 10,67Kb 13 Скачать

См. также

Комментарии
Сортировка: Древо
1. tormozit 4784 08.02.18 09:30 Сейчас в теме
Опечатка "ОбработатьКоллекуию"
6. DarkAn 728 08.02.18 13:03 Сейчас в теме
18. Evil Beaver 5245 08.02.18 18:09 Сейчас в теме
(6) Не везде. В примерах кода часто встречается.
19. DarkAn 728 08.02.18 19:58 Сейчас в теме
(18)видимо в спойлерах не ищет(( доберусь до компа перепроверю через "источник". В обработке поправлено, видимо пока готовил статью в Ворде не заметил). Спасибо.
2. Xershi 373 08.02.18 09:50 Сейчас в теме
Нужны реальные примеры для чего это нужно. Первую версию не читал.
7. DarkAn 728 08.02.18 13:05 Сейчас в теме
(2) Реальные примеры - чтоб у всех работало, придумать толком не смог :)
Идею можно посмотреть Тут
10. DarkAn 728 08.02.18 13:12 Сейчас в теме
(2)
чего это нужно
С помощью "ОбработатьОбъект" распараллелил партии в УПП Вот результаты
3. infosoft-v 282 08.02.18 10:04 Сейчас в теме
Здравствуйте. Мощная работа.
Проект есть на GitHub? Можно ссылку?
8. DarkAn 728 08.02.18 13:07 Сейчас в теме
(3) Нет нету :( Еще с ним не разобрался :(
4. dandykry 3 08.02.18 10:32 Сейчас в теме
Однозначный плюс за разработку.
5. tsukanov 65 08.02.18 10:54 Сейчас в теме
Эх. Вот сделали бы в платформе возможность ожидать завершения хотя бы одного задания из массива,
и все эти извраты были бы не нужны.
9. DarkAn 728 08.02.18 13:10 Сейчас в теме
(5) Ну так запускайте не в массиве, а по одному :) Массив то зачем?
11. tsukanov 65 08.02.18 13:24 Сейчас в теме
(9) А как ожидать завершения? По таймеру проверять?

Суть то в том, чтобы запустить пачку заданий и при завершении хотя бы одного тут же выдать новое задание с новой порцией данных. Так можно максимально утилизировать процессор и управление потоками становится тривиальным
12. DarkAn 728 08.02.18 13:25 Сейчас в теме
(11) Можно по таймеру, можно по значению переменной (в текущей реализации она также сохраняется в общих настройках) и мониторить ее на каждой итерации.
13. tsukanov 65 08.02.18 13:26 Сейчас в теме
(12) Вот вот. Извращения. А все из-за дурацкой реализации ожидания в платформе

ps Посмотрите в Go оператор Select - вот там правильно сделано
starik-2005; +1 Ответить
14. DarkAn 728 08.02.18 13:34 Сейчас в теме
(13) На сколько я понимаю, в Вашей реализации вы предлагаете задействовать, недавние вирусы (meltdown и spectre), тогда возможно получиться получать ответ сразу как задание выполнено :)
15. tsukanov 65 08.02.18 13:35 Сейчас в теме
(14) Не понял о чем вы. В общем смотрите как сделано в Go
28. tsukanov 65 07.09.18 08:10 Сейчас в теме
(14) Вышла 13 платформа, в которой это стало возможно )
29. DarkAn 728 07.09.18 10:49 Сейчас в теме
(28)
ышла 13 платформа, в которой это стало возмож

А можно по подробнее? На что обратить внимание?
30. tsukanov 65 07.09.18 14:01 Сейчас в теме
(29) Там новый метод для ожидания появился. Вот пример использования как я описывал выше: gist.github.com/tsukanov-as/4a75e731d959017d7238e5ce456e6f28

Ждем изменения статуса хотя бы одного и подменяем сразу на новое задание.
20. izidakg 137 08.02.18 22:54 Сейчас в теме
развитие будет или все задуманное реализовано?
22. DarkAn 728 09.02.18 09:06 Сейчас в теме
(20) Есть еще несколько идей (осталось только время найти для их воплощения). Они пока не реализованы, т.к. реализуй я их, то текущую версию выложил бы еще не скоро. Так основные задумки все работают - можно смело пользоваться.
21. artemka 09.02.18 07:59 Сейчас в теме
А каким образом происходит восстановление партий в несколько потоков? Например, для того, чтобы восстановить партию, мне нужно знать остатки по номенклатуре на дату, а пока предыдущий поток не завершится этих данных не будет.
23. DarkAn 728 09.02.18 09:09 Сейчас в теме
(21) Артем, для ответа на Ваш вопрос, я рекомендую Вам ознакомится первым постом и с текущим. В первом посте вообще все рассказывалось отталкиваясь именно от этой задачи.
Для простоты понимания посмотрите примеры из первого поста
24. gubanoff 44 09.02.18 10:42 Сейчас в теме
(0) на какой версии платформы можно использовать?
25. DarkAn 728 09.02.18 10:56 Сейчас в теме
(24) 8.2 и 8.3. v1 тестировалась на 1С:Предприятие 8.3 (8.3.9.1850) обычные формы. Примеры имеют и обычную, и управляемую формы.
26. kauksi 203 06.04.18 09:24 Сейчас в теме
У меня когда то была идея для РАУЗ... передать матрицу через внешнюю компоненту и быстренько посчитать все через CUDA... тока вот руки так и не дошли
27. kote 482 06.07.18 23:21 Сейчас в теме
(26)

.. знаю таких 2 в своей организации - это кроме себя :)

Кто об этом еще задумывался?
Оставьте свое сообщение