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

18.03.20

База данных - HighLoad оптимизация

Увеличиваем скорость загрузки данных в 20 раз. Как следует использовать многопоточность и готовый модуль для внедрения.

Добрый день, коллеги.

Небольшая статейка и готовое решение для внедрения в свою конфигурацию.

Введение

Вот, сколько я проработал и не разу всерьез не задумывался о многопоточности, пока не начал работу над проектом "Классификатор адресов Украины". При работе в рамках этого проекта столкнулся с необходимость загрузки большого объема данных в конфигурацию, а точнее - необходимо было создать множество элементов в разных справочниках, счет шел на 10-ки а то и 100-ни тысяч элементов...

И как бы меня стало очень сильно "напрягать" продолжительная загрузка данных в рамках тестирования. Ну, что же теперь? Решил поискать в "интернетах", и к сожалению, нашел только старые статьи(но по большому счету ничего с тех времен не изменилось). Да и готового, качественного решения не нашел, пришлось писать самому. И к моему удивлению, скорость загрузки я смог увеличить в 20 раз, благодаря элементарному коду... Какой же глупый я был)

НО ускорения в 20 раз я добился только на сервере, на своей печатной машинке, ускорение было всего 2 раза, при использовании 2 потоков, использовать больше не рекомендую, т.к. особого эффекта от этого не будет. Результат тестов прилагаю.

Ну, как говорится, "погнали".

Внедрение

1. Создаем общий модуль(серверный), называем его "Многопоточность".

2. Копируем в него ниже изложенный код:


#Область ПрограммныйИнтерфейс

// Запускается выполнение указанной процедуры в много поточном режиме 
//
// Параметры:
//  ИмяПроцедуры - Строка - имя экспортной процедуры общего модуля или модуля менеджера объекта, 
//                          которую необходимо выполнить в фоне (ЭкспортнаяПроцедура).
//                          Например, "МойОбщийМодуль.МояПроцедура", "Документы.МойДокумент.МояПроцедура".
//                          У процедуры должен быть один формальный параметр:
//                          * ПараметрыЭкспортнойПроцедуры - Произвольный - произвольные параметры ПараметрыЭкспортнойПроцедуры;
//  СписокДанных - Массив - массив данных, которые будут разделены на части и переданы процедуру,
//                          которая указа в параметре "ИмяПроцедуры".
//  КоличествоПотоков - Число - количество потоков на которое необходимо разделить обработку СпискаДанных,
//                              значение по умолчанию равно 2.
//  Ожидание - Булево - признак указывающий на необходимость ожидания выполнения всех фоновых заданий,
//                      Истина - ожидать пока выполнятся все задания и потом возвращать управление в вызываемый код,
//                      Ложь - возвращать управление в вызываемый код сразу после создания всех заданий.
//
// Возвращаемое значение:
//  <Отсутствует> - 
//
// Варианты вызова:
//  Запустить(ИмяПроцедуры, СписокДанных) - 
//
Функция Запустить(Знач ИмяПроцедуры, Знач СписокДанных, Знач КоличествоПотоков = Неопределено, Знач Ожидание = Истина) Экспорт

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

	// Проверка остатка данных,
	// при необходимости выполнение "ЭкспортнаяПроцедура" с остатком данных,
	// количество которых меньше рассчитаного размера порции.
	Если Данные.Количество() > 0 Тогда
		ЗапуститьВФоне(ИмяПроцедуры, Данные, СписокФоновыхЗаданий);		
	КонецЕсли;
	
	// Ожидание при необходимости и задержка передачи управления в вызываемый код.
	Если Ожидание Тогда
		ФоновыеЗадания.ОжидатьЗавершенияВыполнения(СписокФоновыхЗаданий);
	КонецЕсли;
	
КонецФункции // Запустить()

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

Функция ЗапуститьВФоне(ИмяПроцедуры, СписокДанных, СписокФоновыхЗаданий)
	
	Параметры = Новый Массив;
	Параметры.Добавить(СписокДанных);

	СписокФоновыхЗаданий.Добавить(
		ФоновыеЗадания.Выполнить(ИмяПроцедуры, Параметры));

	СписокДанных.Очистить();
	
КонецФункции // ЗапуститьВФоне()

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция РассчитатьРазмерПорции(КоличествоДанных, КоличествоПотоков)

	Возврат Цел(КоличествоДанных / КоличествоПотоков);
	
КонецФункции // РассчитатьРазмерПорции()

Функция РассчитатьКоличествоПотоков(КоличествоДанных, КоличествоПотоков)

	Возврат ?(КоличествоПотоков <> Неопределено, КоличествоПотоков, 2)
	
КонецФункции // РассчитатьКоличествоПотоков()

#КонецОбласти

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

3. Начинаем наслаждаться и использовать.

 

Использование

Теперь в любом серверном методе вам необходимо всего лишь вызвать функцию Запустить нашего созданного общего модуля Многопоточность.

Пример вызова:

Многопоточность.Запустить("КлассификаторАдресовУкраины.ЗагрузитьРайоныКОАТУУ", СписокРайонов, 10);

где:

  • КлассификаторАдресовУкраины - это общий модуль(серверный)
  • ЗагрузитьРайоныКОАТУУ - это экспортная процедура модуля КлассификаторАдресовУкраины
  • СписокРайонов - массив данных, а в массиве у меня лично элементы с типом - Структура
  • 10 - количество потоков.

Пример реализации процедуры, которою будем вызывать:

Процедура ЗагрузитьРегионыКОАТУУ(СписокДанных) Экспорт
	
	Для Каждого Элемент Из СписокДанных Цикл
		
		// траляля
		
	КонецЦикла;	    

КонецПроцедуры // ЗагрузитьРегионыКОАТУУ

В этой процедуре в параметр попадает часть(кусок) данных из тех данных которые мы передали в функцию Многопоточность.Запустить()

 

Заключение

Вот собственно и все, надеюсь, все доступно объяснил, у кого есть предложения по улучшению - предлагайте. Буду рад!)

З.Ы. Использую функции, а не процедуры, т.к. планирую что-то доработать, а что, еще не придумал)))

См. также

Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    2337    spyke    25    

38

Анализируем SQL сервер глазами 1С-ника

HighLoad оптимизация Инструменты администратора БД Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих зааросов на sql, ожиданий, конвертация запроса в 1с и рекомендации где может тормозить

1 стартмани

15.02.2024    7345    148    ZAOSTG    66    

95

Удаление строк из таблицы значений различными способами с замером производительности

HighLoad оптимизация Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    5760    doom2good    48    

63

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    8574    ivanov660    6    

75

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    4998    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    15954    skovpin_sa    14    

97

Как эффективно настроить autovacuum в Postgres для 1С

HighLoad оптимизация Администрирование СУБД Платформа 1С v8.3 Бесплатно (free)

Кто не любит убирать мусор? Думаю, практически все, а вот в Postgres это обязательный ритуал для эффективной работы. Как эффективно настроить уборку за 1С в Postgres, можно прочитать в этой статье и еще раз задуматься о бесплатности Postgres.

05.08.2023    4971    1CUnlimited    5    

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Даже Аристотель в своих писал "молодежь уже не та".
25. buganov 200 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 135 18.03.20 13:12 Сейчас в теме
(25) кстати эту статью я не нашел, наверное плохо искал.
Ремиксы и репосты полностью с вами согласен. Кто-то поймет другою статью а кто-то эту.
У меня так часть бывает... Даже код может быть одинаковый но автор мне объяснил по другому и я сразу понял что к чему...
23. buganov 200 18.03.20 13:02 Сейчас в теме
Кстати, странно, что при двух потоках аж в 20 раз увеличилась скорость. Откуда такой прирост, если данные дробятся "как бог на душу положит" или перед передачей в процедуру Вы уже разбиваете? Если готовые данные передаете, то тем более не вижу смысла дробить еще раз.
Поясню. Допустим, у нас есть таблица данных из, скажем из миллиона строк, которые нужно впихнуть быстро в, например, регистр сведений.
Эта таблица отлично бьется в разрезе каких-то полей, например, по полю Склад. Пусть складов в таблице 10, значит будет 10 потоков, больше не стоит, можно сильно нагрузить сервера. И это был бы наиболее верный алгоритм.
В связи с этим, правильней, я считаю, оставлять дробление данных на руки разработчика, который просто передаст в длительную операцию запись, а потом просто подождет завершения всех потоков
27. kaliuzhnyi 135 18.03.20 13:08 Сейчас в теме
(23) На сервере скорость увеличилась примерно в раза, если использовать 2 потока. На картинках посмотрите. Время указано в секундах. В двадцать раз скорость загрузки увеличилась когда я "жахнул" 20 потоков)))
31. DarkAn 1078 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 135 18.03.20 22:03 Сейчас в теме
(31)
я скажу что мне надо 5 потоков, а будет запущено 6, т.к. в 6 попадет "хвост" данных

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

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

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

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

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

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

Подобным способом увеличили скорость проведения документов реализации, прирост в скорости проведения получился в ускорении в 4-5 раз, по сравнению с последовательным проведением документов по 1му, и теперь склад не при каких обстоятельствах не готов возвращаться к старому механизму. Правда УППшечку пришлось перед этим очень плотно готовить, переписать механизм допроведения документов + перевести базу в RCSI, выпилить весь говнокод с обращениями через точку к полям ссылочного типа и все, вуаля, все счастливы.
44. starik-2005 3031 01.03.21 11:56 Сейчас в теме
А я вот плюс влепил статье, ибо она говорит о том, что современные компы (даже ноуты) имеют несколько ядер, на каждом, обычно, по парочке потоков.

Я в свое время писал две статьи про многопоток - про саму многопоточность и про мьютексы на 1С, без которых многопоточность местами страдает, ибо внешние компоненты не потокобезопасны (да, 1С - это ржавое желтое унылое г-но, ибо не могут программисты толково написать на сях потокобезопасный код - учитесь, желтые "сишники": https://ru.wikipedia.org/wiki/Thread-safety, но, боюсь, там еще старая школа рулит, которая про потоки плохо знает и соответствующие тесты писать не умеет)

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

ЗЫ: Скорость даже на ноуте, если нет кеширования в БД, растет пропорционально количеству потоков, ибо при отсутствии кеширования система утилизирует множественные ожидания на I/O.

ЗЫЗЫ: если есть сложные учетные задачи, то есть масса способов их распараллелить. Многопоточность в лоб - это не лучший вариант для таких задач, а вот распараллеливание записи изменений и кеширование исторических данных - это может очень серьезно повысить производительность любой задачи, пишущей множество транзакций.
45. PowerBoy 3347 24.06.21 06:33 Сейчас в теме
Многопотчность вполне можно использовать для решения текущих задач. Надо было почистить Розницу от всех документов. Анализ показал, что обычное удаление будет идти более суток. Используя PowerTools задача была выполнена за 30 минут.
Оставьте свое сообщение