Всем доброго времени суток, товарищи! Есть задача запустить загрузку данных в несколько потоков. Число потоков ограничено. К примеру, есть у меня 100 записей и 2 потока. Максимальный размер порции 10 записей. Запускается 2 фоновых задания. Каждое должно затащить 5 раз по десять. Я в этом деле новичок, если честно, простите. Как мне определить, что, например, первое задание уже загрузило десять записей, и можно его запускать на загрузку ещё 10-ти записей. И так же со вторым. Либо предложите свой подход. Спасибо!
(1) Запускаем родительское задание и оно занимается планирование и запуском дочерних в нужном количестве и с нужным объемом порции. По окончании запущенных запускаются следующие.
Есть задача запустить загрузку данных в несколько потоков.
А откуда они загружаются? Из файлов? Из сервисов? Из другой базы по СОМ-у?
Обычно для многопоточных операция реализуют поток управления, который скармливает данные потокам при их освобождении. Но есть и другие варианты, и никакой вариант не может быть правильным или неправильным, если решает вопрос так, как надо. Например, можно прямо в потоке определять, какой кусок данных брать дальше. Для этого достаточно где-то хранить карту данных, в которой отражать, какие данные уже обрабатываются, какие обработаны и какие свободны для обработки. Менять карту можно прямо из потока при принятии решения о следующей порции данных. Но нужно защитить карту от чтения другим потоком на время принятия решения. Блокировки 1С сделаны через одно место, поэтому я бы предложил юзать файловую блокировку, для этого достаточно попытаться открыть на запись текстовый файл. Два потока одновременно не могут это сделать, поэтому один будет валиться в исключение. Если обернуть это в цикл, то получится спинлок. В итоге алгоритм простой: формируем карту данных (по порциям). Запускаем два потока. Поток ставит спинлок, читает карту, выбирает первый необработанный участок, помечает его, как обрабатываемый, закрывает файл блокировки, обрабатывает, в это время второй поток пытается открыть файл блокировки в спинлоке, открывает его на запись после того, как первый поток решил, чем займется, читает карту, отмечает свой блок, записывает карту, закрывает файл... Если это мутнуть в регистре сведений, то и 1С-ную блокировку можно заюзать, попытавшись захватить весь регистр с картой (я хз, как это делать)...
В целом ничего сложного - запускаем фоновые задания, передаем в них в качестве параметра данные для обработки(или параметры, позволяющие эти данные однозначно определить внутри фонового) и проверяем их состояние периодически
Сделать это можно либо методом ОжидатьЗавершения() менеджера фоновых заданий, либо через ПолучитьФоновыеЗадания() ищем задания и проверяем их статус, в зависимости от статуса понимаем завершилось ли задание и завершилось ли оно успешно.
Но это будет работать только на клиент-сервере. Ну и про блокировки, которые могут возникнуть, не забывайте.