Многопоточность

0. kaliuzhnyi 18.03.20 07:54 Сейчас в теме
Увеличиваем скорость загрузки данных в 20 раз.
Как следует использовать многопоточность и готовый модуль для внедрения.

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. tech_supp19 18.03.20 08:32 Сейчас в теме
А почему не использовали готовые модули "Длительные операции" из БСП?
portwein; potoyalo; mvxyz; Evg-Lylyk; lk255; +5 Ответить
2. kaliuzhnyi 18.03.20 09:41 Сейчас в теме
(1)
Я там не увидел многопоточности. А вы видели?
3. tech_supp19 18.03.20 09:58 Сейчас в теме
(2) Конечно. Так же как и в этой публикации я вижу фоновые задания, как бы Вы их не назвали.
portwein; lk255; +2 Ответить
6. kaliuzhnyi 18.03.20 10:19 Сейчас в теме
(3)
Ну если вы не видите разницы между одним фоновым заданием и двумя фоновыми заданиями которые выполняются параллельно. То мне сложно что-то объяснить.
И да, вы можете использовать ДлительныеОперации, только перед этим не забудьте разбить ваши данные на части.
user1035175; +1 1 Ответить
10. tech_supp19 18.03.20 10:45 Сейчас в теме
(6) Мне ничего не мешает запускать несколько операций с разными параметрами.
11. kaliuzhnyi 18.03.20 10:57 Сейчас в теме
(10) Так никто-же не заставляет использовать...
Только тогда вам все эти циклы и разбития данных на части необходимо писать в своей форме и/или модуле, и тогда ваш код превратится в свалку, а чтобы не было свалки нужно создать отдельный модуль(о чем и написано в статье) и в этом модуле прописать практически все то-же что и у меня выложено...
А когда вам необходимо будет загрузить подряд 5 справочников(область, район, город, улица, дом) и при этом именно ПОДРЯД, т.к. каждый справочник подченен другому... Я бы посмотрел на ваш код где подряд 5 массив с разбиением данных и 10 раз запуск Длительных операций, тогда ваш код станет просто непригодным к использованию.
К тому же не стоит забывать о разных конфигурациях, где код загажен до такой степи, что плакать хочется, в том числе есть конфигурации где некоторые умники полезли править типовые механизмы, также есть самописные, и если вам приходится приходится работать только с типовыми и не "правленными" конфигурациями то вам повезло очень сильно.
А этот модуль рассчитан на то, чтобы его закинуть в любую конфигурацию, и работать сразу.
frkbvfnjh; Fox-trot; +2 Ответить
13. VmvLer 18.03.20 11:03 Сейчас в теме
(11) "О боже, как же я прекрасен")
o.nikolaev; user1371486; Lyolik; tech_supp19; +4 Ответить
14. kaliuzhnyi 18.03.20 11:32 Сейчас в теме
(13) Наверное по с равнению с вами да... Мне случайно не с вашим кодом приходится работать который написан задним местом?
16. VmvLer 18.03.20 11:36 Сейчас в теме
(14) вы всегда переходите на личности когда сталкиваетесь с критикой или вас просто плохо учили вести диалог?)
Lyolik; CyberCerber; +2 Ответить
24. kaliuzhnyi 18.03.20 13:03 Сейчас в теме
(16) Так вы же первый перешли на личности...
izidakg; user843241; the1; +3 Ответить
26. kaliuzhnyi 18.03.20 13:04 Сейчас в теме
(16) Я всего лишь пытался донести практическую пользу от выложенного модуля.
41. tech_supp19 23.03.20 09:59 Сейчас в теме
(11)
Только тогда вам все эти циклы и разбития данных на части необходимо писать в своей форме


Логичнее это вынести в отдельный модуль - обертку над длительными операциями (которые есть во всех актуальных конфигурациях). В котором будет разбивка параметров и запуск необходимого числа фоновых заданий.
4. Eskimos 26 18.03.20 10:05 Сейчас в теме
Вот этот массив:
Данные = Новый Массив;

Я бы очищал после каждого вызова:
 ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);
pm74; vano-ekt; kaliuzhnyi; +3 Ответить
7. kaliuzhnyi 18.03.20 10:21 Сейчас в теме
37. riposte 300 21.03.20 07:32 Сейчас в теме
Автор, конечно, тот еще молодец, но,
не стоит забывать о разных конфигурациях, где код загажен до такой степи, что плакать хочется, в том числе есть конфигурации где некоторые умники полезли править типовые механизмы
...
А этот модуль рассчитан на то, чтобы его закинуть в любую конфигурацию, и работать сразу.

Хорошо, давай посмотрим.
	КоличествоДанных = СписокДанных.Количество();
	КоличествоПотоков = РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков);
	РазмерПорции = Цел(КоличествоДанных / КоличествоПотоков);

	Данные = Новый Массив;
	Для Каждого Элемент Из СписокДанных Цикл
		
		// Добавление данных в порцию.
		Данные.Добавить(Элемент);
		
		// Проверка размера порции и при достижении рассчитаного размера,
		// запуск выполнения в фоне "ЭкспортнаяПроцедура".
		Если Данные.Количество() = РазмерПорции Тогда
			ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);
	                Данные = Новый Массив; // Забыли очистить данные? Или очищаем в ЗапуститьВФоне?
		КонецЕсли;
		
	КонецЦикла;
Показать

А что делать с остатком деления?

P.S. Если исполняемый код обхода массива был таким, как в публикации, при замере времени выполнения, а Данные не очищались - прирост "в 20 раз" как бы становится понятен. Было обработана 1\20 часть данных, потому и в 20 раз быстрее :3
Прикрепленные файлы:
ВнешняяОбработка1.epf
38. kaliuzhnyi 21.03.20 20:05 Сейчас в теме
(37)
А что делать с остатком деления?

Смотрите внимательнее!
40. riposte 300 21.03.20 20:40 Сейчас в теме
39. kaliuzhnyi 21.03.20 20:07 Сейчас в теме
(37)
// Забыли очистить данные? Или очищаем в ЗапуститьВФоне?

Еще раз посмотрите внимательнее!
5. vano-ekt 840 18.03.20 10:19 Сейчас в теме
8. kaliuzhnyi 18.03.20 10:26 Сейчас в теме
(5) Принцип тот же. Но в той статье нужно думать)) и подгонять под себя. А я выложил просто готовый модуль который готов к использованию.
9. RocKeR_13 819 18.03.20 10:32 Сейчас в теме
(8)
Но в той статье нужно думать))

Напомнило недавнюю фразу кандидата на должность стажера
А что, тут еще книжки нужно читать?
12. VmvLer 18.03.20 11:00 Сейчас в теме
велик конеш.
да и для таких задач как классификаторы где данные можно четко разделить на порции иногда
проще запустить несколько сеансов чем связываться с капризами фоновых, которые падают как
дебютантки на балах поле первого бокала.

многопоточность в учетных задачах 1С, на данный момент, миф.
15. kaliuzhnyi 18.03.20 11:34 Сейчас в теме
(12) А есть другие варианты?)
Ну, миф не миф, а у меня время загрузки сократилась в десятки раз. А главное результат.
&rew; davdykin; +2 Ответить
17. VmvLer 18.03.20 11:40 Сейчас в теме
(15) Расчеты себестоимости в УТ, ЕРП и прочие "окабаневшие" процессы запускают десятки фоновых якобы в целях многопочтности, а толку?

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

не вижу смысла далее вести диалог, вы правы в своих заблуждениях)
18. dinopopyys 120 18.03.20 12:33 Сейчас в теме
ну в целом да, своего рода многопоточность. Автор молодец.
Другое дело зачем она в 1с? - очень мало применения.
kaliuzhnyi; +1 2 Ответить
21. Nikola23 511 18.03.20 12:54 Сейчас в теме
(18)
Загрузка данных из внешних источников
Обработка запросов веб-сервера
Постобработка данных
Удаление помеченных объектов
Закрытие месяца. В последних версиях платформы решение систем линейных уравнение сделали многопоточным (или обещали сделать)
Проведение по регистрам, если они не связаны особой бизнес-логикой

Комментаторы, дополнят список
19. user1371486 18.03.20 12:43 Сейчас в теме
Читая такие статьи, все больше убеждаюсь, что ИС окончательно скатывается в помойку. Скоро найти нормальную инфу будет не реально. остались статьи о жизни, проектном управлении, да вот такие вот шедевры. Скоро начнутся статьи, как один массив разделить на несколько.
user1311038; azhilichev; vladimirmatancev; CyberCerber; Evg-Lylyk; DarkAn; +6 4 Ответить
29. kaliuzhnyi 18.03.20 13:14 Сейчас в теме
(19)
А вы много знаете способов разделить массив на несколько? А какой будет эффективнее?
32. user1371486 18.03.20 15:06 Сейчас в теме
(29) Вам, голубчик, уже и без того в комментах напихали. Ибо оптимальный способ разделения массива на части Вы, увы, не осилите.
33. kaliuzhnyi 18.03.20 21:47 Сейчас в теме
(29) Из-за таких как вы голубчик, потом страдают заказчики...
И потом приходится переделывать ваш г*но код приходится, где разделение массива происходит через задний проход.
36. user1371486 19.03.20 09:27 Сейчас в теме
(33) Переход на личности засчитан.
Далее. Мои заказчики страдают? А вдруг я работаю госпожой в БДСМ-салоне, и они приходят ко мне именно пострадать. Через какой проход - не суть важно. Я же не публикую это на ИС: смотрите, как ускоряется код после N ударов плеткой программисту.

P.S.
В следующий раз правильно выбирайте номер поста в ответ. А то ведь оно заразно - сегодня номер поста не тот, завтра не ту переменную на вход в функцию подсунете.
AlexeyPapanov; user1311038; +2 Ответить
20. buganov 153 18.03.20 12:53 Сейчас в теме
Вот же о многопоточности в 1С. Отлично расписано.И я бы даже сказал, что данная статья просто повторяет статью Бурмистрова.
https:// /articles/как-ускорить-1с-многопоточность/
22. Nikola23 511 18.03.20 12:58 Сейчас в теме
(20) ссылка не работает.

Репосты и ремиксы - это наша реальность.

Ничего страшного, если автор переоформит повторно ранее написанное.
Кто-то поймет по его описанию, кто-то поймет тему по статье 7ми летней давности.

Ну а нытики с комментариями "раньше было лучше" всегда есть, были и будут.

Даже Аристотель в своих писал "молодежь уже не та".
25. buganov 153 18.03.20 13:04 Сейчас в теме
(22) да не ною я. Репосты и ремиксы ценны тем, что дополняют оригинальную статью, а не просто копипастят.
Вот ссылка.
https://xn----1-bedvffifm4g.xn--p1ai/articles/%D0%BA%D0%B0%D0%BA-%D1%83%D1%81%D0%BA%D0%BE%D1%80%D0%B8%D1%82%D1%8C-1%D1%81-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87­%D0%BD%D0%BE%D1%81%D1%82%D1%8C/
28. kaliuzhnyi 18.03.20 13:12 Сейчас в теме
(25) кстати эту статью я не нашел, наверное плохо искал.
Ремиксы и репосты полностью с вами согласен. Кто-то поймет другою статью а кто-то эту.
У меня так часть бывает... Даже код может быть одинаковый но автор мне объяснил по другому и я сразу понял что к чему...
23. buganov 153 18.03.20 13:02 Сейчас в теме
Кстати, странно, что при двух потоках аж в 20 раз увеличилась скорость. Откуда такой прирост, если данные дробятся "как бог на душу положит" или перед передачей в процедуру Вы уже разбиваете? Если готовые данные передаете, то тем более не вижу смысла дробить еще раз.
Поясню. Допустим, у нас есть таблица данных из, скажем из миллиона строк, которые нужно впихнуть быстро в, например, регистр сведений.
Эта таблица отлично бьется в разрезе каких-то полей, например, по полю Склад. Пусть складов в таблице 10, значит будет 10 потоков, больше не стоит, можно сильно нагрузить сервера. И это был бы наиболее верный алгоритм.
В связи с этим, правильней, я считаю, оставлять дробление данных на руки разработчика, который просто передаст в длительную операцию запись, а потом просто подождет завершения всех потоков
27. kaliuzhnyi 18.03.20 13:08 Сейчас в теме
(23) На сервере скорость увеличилась примерно в раза, если использовать 2 потока. На картинках посмотрите. Время указано в секундах. В двадцать раз скорость загрузки увеличилась когда я "жахнул" 20 потоков)))
31. DarkAn 943 18.03.20 14:33 Сейчас в теме
(0) уж не знаю как Вы искали информацию по многопоточности, но на том же ИС их более, чем достаточно
Ваша реализация, показанная в данной статье, САМАЯ простая. Она не учитывает множество нюансов по работе с потоками.

В далеком 2017 году я уже писал (https://infostart.ru/public/626117/ 52 комментарий)

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


Ваше решение имеет еще ряд недоработок, в частности:
* я скажу что мне надо 5 потоков, а будет запущено 6, т.к. в 6 попадет "хвост" данных
* а что будет если размер порции будет < 1?
* а есть ли смысл запускать в потоках если данных в подаваемой выборке мало?
* и т.д.

Если Вам будет интересно, можете ознакомиться с моей публикацией на тему многопоточности (https://infostart.ru/public/778905/), возможно найдете идеи для своего проекта.
vladimirmatancev; user1371486; dime2; kaliuzhnyi; kiruha; +5 Ответить
34. kaliuzhnyi 18.03.20 22:03 Сейчас в теме
(31)
я скажу что мне надо 5 потоков, а будет запущено 6, т.к. в 6 попадет "хвост" данных

спасибо, исправлю.
а что будет если размер порции будет < 1?

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

а тут уже решает разработчик который запускает эту процедуру.

вашу статью обязательно прочту, она на первый взгляд хорошо изложена)

но допустим статья которую вы привели - https://infostart.ru/public/626117/ , довольно сложная в понимании, к таким статьям необходимо переходить после того будут понятны элементарные вещи, которые собственно я и описал...
30. frkbvfnjh 587 18.03.20 14:32 Сейчас в теме
З.Ы. Использую функции, а не процедуры, т.к. планирую что-то доработать, а что, еще не придумал)))

На мой взгляд, процедуры вообще зло, все должно быть функциями, пусть даже они будут возвращать "Неопределено", в частности боль начинается когда не можешь выполнить процедуру во время отладки, просто потому, что она процедура.
CyberCerber; +1 Ответить
42. AlX0id 30.03.20 08:12 Сейчас в теме
(30)
И более того - каждая функция должна возвращать информацию об успешности/неуспешности выполнения )
Ну это как по мне.
35. _ASZ_ 100 19.03.20 08:05 Сейчас в теме
Простой код, решение задачи "в лоб"...
А если один или несколько из потоков будут завершены аварийно или "убиты" на кластере? Удобно ли отлаживать код, обернутый в такие конструкции? Есть и более зрелые решения.
Evg-Lylyk; dsdred; user1371486; +3 Ответить
43. user612295_death4321 05.04.20 09:23 Сейчас в теме
Если продумать на перед, что выполняемые фоновые порции не попадут на конкурентную запись (не просядет железка, не будет блокировок 1С или СУБД), то это вполне рабочий вариант с ускорением выполнения операций.

Подобным способом увеличили скорость проведения документов реализации, прирост в скорости проведения получился в ускорении в 4-5 раз, по сравнению с последовательным проведением документов по 1му, и теперь склад не при каких обстоятельствах не готов возвращаться к старому механизму. Правда УППшечку пришлось перед этим очень плотно готовить, переписать механизм допроведения документов + перевести базу в RCSI, выпилить весь говнокод с обращениями через точку к полям ссылочного типа и все, вуаля, все счастливы.
Оставьте свое сообщение
Вопросы с вознаграждением