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

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

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

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

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

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

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

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

так было в «v1»

 

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

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

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

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

 

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

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

Обработки

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

См. также

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

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

ps Посмотрите в Go оператор Select - вот там правильно сделано
starik-2005; +1 Ответить
14. Иван Филимонов (DarkAn) 710 08.02.18 13:34 Сейчас в теме
(13) На сколько я понимаю, в Вашей реализации вы предлагаете задействовать, недавние вирусы (meltdown и spectre), тогда возможно получиться получать ответ сразу как задание выполнено :)
15. Александр Цуканов (tsukanov) 103 08.02.18 13:35 Сейчас в теме
(14) Не понял о чем вы. В общем смотрите как сделано в Go
20. Сергей Пономарёв (izidakg) 135 08.02.18 22:54 Сейчас в теме
развитие будет или все задуманное реализовано?
22. Иван Филимонов (DarkAn) 710 09.02.18 09:06 Сейчас в теме
(20) Есть еще несколько идей (осталось только время найти для их воплощения). Они пока не реализованы, т.к. реализуй я их, то текущую версию выложил бы еще не скоро. Так основные задумки все работают - можно смело пользоваться.
21. Артем Коноплин (artemka) 09.02.18 07:59 Сейчас в теме
А каким образом происходит восстановление партий в несколько потоков? Например, для того, чтобы восстановить партию, мне нужно знать остатки по номенклатуре на дату, а пока предыдущий поток не завершится этих данных не будет.
23. Иван Филимонов (DarkAn) 710 09.02.18 09:09 Сейчас в теме
(21) Артем, для ответа на Ваш вопрос, я рекомендую Вам ознакомится первым постом и с текущим. В первом посте вообще все рассказывалось отталкиваясь именно от этой задачи.
Для простоты понимания посмотрите примеры из первого поста
24. Александр Губанов (gubanoff) 45 09.02.18 10:42 Сейчас в теме
(0) на какой версии платформы можно использовать?
25. Иван Филимонов (DarkAn) 710 09.02.18 10:56 Сейчас в теме
(24) 8.2 и 8.3. v1 тестировалась на 1С:Предприятие 8.3 (8.3.9.1850) обычные формы. Примеры имеют и обычную, и управляемую формы.
26. Сергей Капустин (kauksi) 202 06.04.18 09:24 Сейчас в теме
У меня когда то была идея для РАУЗ... передать матрицу через внешнюю компоненту и быстренько посчитать все через CUDA... тока вот руки так и не дошли
Оставьте свое сообщение