Последовательно-параллельное выполнение фоновых заданий

1. Гость 10.11.23 02:18
Всем доброго времени суток, товарищи! Есть задача запустить загрузку данных в несколько потоков. Число потоков ограничено. К примеру, есть у меня 100 записей и 2 потока. Максимальный размер порции 10 записей. Запускается 2 фоновых задания. Каждое должно затащить 5 раз по десять. Я в этом деле новичок, если честно, простите. Как мне определить, что, например, первое задание уже загрузило десять записей, и можно его запускать на загрузку ещё 10-ти записей. И так же со вторым. Либо предложите свой подход. Спасибо!
Вознаграждение за ответ
Для передачи вознаграждения воспользуйтесь кнопкой "Отдать $m" в сообщении. Для возврата вознаграждения, отдайте его самому себе. Можно вознаграждение разделить между несколькими участниками. Не забывайте нажимать кнопку "Это решение", это повысит вашу репутацию.
Показать полностью
Найденные решения
5. Дмитрий74Чел 234 15.11.23 12:44 Сейчас в теме
В БСП уже есть штатный метод ВыполнитьПроцедуруВНесколькоПотоков
https://infostart.ru/1c/articles/1625217/
Отменить Отдать $m
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. RustamZz 10.11.23 08:10 Сейчас в теме
(1) Запускаем родительское задание и оно занимается планирование и запуском дочерних в нужном количестве и с нужным объемом порции. По окончании запущенных запускаются следующие.
Это решение Отдать $m
Super_Vasek; ImHunter; +2 Ответить
4. starik-2005 3039 10.11.23 12:22 Сейчас в теме
(1)
Есть задача запустить загрузку данных в несколько потоков.
А откуда они загружаются? Из файлов? Из сервисов? Из другой базы по СОМ-у?
Обычно для многопоточных операция реализуют поток управления, который скармливает данные потокам при их освобождении. Но есть и другие варианты, и никакой вариант не может быть правильным или неправильным, если решает вопрос так, как надо. Например, можно прямо в потоке определять, какой кусок данных брать дальше. Для этого достаточно где-то хранить карту данных, в которой отражать, какие данные уже обрабатываются, какие обработаны и какие свободны для обработки. Менять карту можно прямо из потока при принятии решения о следующей порции данных. Но нужно защитить карту от чтения другим потоком на время принятия решения. Блокировки 1С сделаны через одно место, поэтому я бы предложил юзать файловую блокировку, для этого достаточно попытаться открыть на запись текстовый файл. Два потока одновременно не могут это сделать, поэтому один будет валиться в исключение. Если обернуть это в цикл, то получится спинлок. В итоге алгоритм простой: формируем карту данных (по порциям). Запускаем два потока. Поток ставит спинлок, читает карту, выбирает первый необработанный участок, помечает его, как обрабатываемый, закрывает файл блокировки, обрабатывает, в это время второй поток пытается открыть файл блокировки в спинлоке, открывает его на запись после того, как первый поток решил, чем займется, читает карту, отмечает свой блок, записывает карту, закрывает файл... Если это мутнуть в регистре сведений, то и 1С-ную блокировку можно заюзать, попытавшись захватить весь регистр с картой (я хз, как это делать)...
Это решение Отдать $m
Super_Vasek; +1 Ответить
2. laperuz 46 10.11.23 04:25 Сейчас в теме
Если новичок, то проще взять готовое решение.
https://infostart.ru/marketplace/778905/ или https://infostart.ru/1c/articles/1211860/ например

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

Но это будет работать только на клиент-сервере. Ну и про блокировки, которые могут возникнуть, не забывайте.
Это решение Отдать $m
Super_Vasek; ImHunter; +2 Ответить
5. Дмитрий74Чел 234 15.11.23 12:44 Сейчас в теме
В БСП уже есть штатный метод ВыполнитьПроцедуруВНесколькоПотоков
https://infostart.ru/1c/articles/1625217/
Отменить Отдать $m
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот