|
|
| ||
DTX 4th 01.10.20 - 11:24 | Знаю, что способов куча. Интересно узнать, кто что использует, когда надо, чтобы код не выполнялся параллельно в несколько потоков?
В данных момент мне нужно обработать записи в регистре сведений. На чтение его блокировать не нужно для других участков кода | ||
polosov 1 - 01.10.20 - 11:32 | (0) Подробнее задачу опиши. | ||
ДенисЧ 2 - 01.10.20 - 11:39 | Обработать - это изменить записи? И в это же время не блокировать их на чтение? | ||
Мойдодыр 3 - 01.10.20 - 11:40 | если транзакции не нужны то можно ЗаблокироватьДляРедактирования | ||
Мойдодыр 4 - 01.10.20 - 11:41 | в любом случае запись блокирует чтение, тк вызывает неявную блокировку | ||
DTX 4th 5 - 01.10.20 - 11:44 | (1) В регистре лежат пиьсма на отправку. Я отбираю те, где "Обработано = Ложь", дальше идут по каждому, отправляю, менеджером записи меняю флаг Обработано | ||
DTX 4th 6 - 01.10.20 - 11:45 | (5) При этом читать регистр запрещать не нужно из других мест. И добавлять туда данные тоже должно быть можно | ||
DTX 4th 7 - 01.10.20 - 11:48 | Вот тут предлагают файлом:
http://catalog.mista.ru/1c/articles/384485/ Но это сработает только если модуль чисто серверный. Хочется что-то вроде
Документы.Док1.СоздатьОбъект().Заблокировать()
Вроде натыкался на что-то подобное, но сейчас не могу найти | ||
Волшебник 8 - 01.10.20 - 11:48 | Параллельная запись в независимый регистр сведений — узкое место. В любой момент блокировка может распространиться на весь регистр. | ||
DTX 4th 9 - 01.10.20 - 11:50 | (8) Запись занимает доли секунду - не страшно.
Сейчас думаю создать РС "Блокировки" и процедуру Заблокировать(ИмяБлокировки). И там уже управляемую блокировку накладывать. Еще варианты? | ||
fisher 10 - 01.10.20 - 11:53 | ИМХО, лучше всего на роль мьютекса подходит Заблокировать(). Не та, которая управляемые блокировки, а та которая объектные. На каком-то служебном элементе можно. | ||
Волшебник 11 - 01.10.20 - 11:56 | (10) Соглашусь. Можно завести предопределённый элемент справочника и блокировать его через
Попытка Объект.Заблокировать() | ||
acht 12 - 01.10.20 - 12:02 | Управляемые блокировки и порцbонная обработка для минимальных транзакций - они для лохов, точно-точно. | ||
Garykom 13 - 01.10.20 - 12:03 | (0) Регламентное или используй объекты которые в измерениях РС | ||
polosov 14 - 01.10.20 - 12:03 | (5) Не совсем понятно зачем тебе мьютекс.
Я реализовывал так: регламент читает записи в РС где "Отправлено = Ложь", спокойно пробегаюсь по списку отправки и после каждого успешного письма пишу в РС "Отправлено = Истина". В это время спокойно другие записи могут добавляться в РС "К отправке". | ||
DTX 4th 15 - 01.10.20 - 12:08 | (14) По задумке некоторые письма должны улетать сразу, если вызвать РС.Рассылка.ОтправитьСейчас()
Если в этот момент будет выполняться регламентное задание, то они могу по два раза письмо отправить
Пока что самое универсальное на мой взгляд - (9) | ||
polosov 16 - 01.10.20 - 12:14 | (15) Почему бы тебе не стартовать регламент руками?
&НаСервере Процедура ЗапуститьРегламентноеЗадание() ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода; // Проверка, выполняется ли фоновое задание по очистке устаревших версий. Отбор = Новый Структура; Отбор.Вставить("ИмяМетода", ИмяМетода); Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно); ФоновыеЗаданияОчистки = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); Если ФоновыеЗаданияОчистки.Количество() = 0 Тогда НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Запуск вручную: %1'"), РегламентноеЗаданиеМетаданные.Синоним); ФоновыеЗадания.Выполнить(ИмяМетода,,, НаименованиеФоновогоЗадания); КонецЕсли; КонецПроцедуры | ||
DTX 4th 17 - 01.10.20 - 12:16 | (16) Хм, интересно. Под задачу подходит.
ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); отрабатывает быстро? Точно не получится, что два задания одинаковых стартануть? Че-т стремновато) | ||
polosov 18 - 01.10.20 - 12:18 | (17) Нормально отрабатывает. Давно таким пользуюсь. | ||
polosov 19 - 01.10.20 - 12:21 | (17) Вообще проверку на запущенное фоновое надо перенести в сам метод, который вызывает регламентное задание. Чтобы проверка была и при ручном запуске и при автоматическом. | ||
fisher 20 - 01.10.20 - 12:30 | (19) А если вручную запускать фоновое с тем же ключом - запустится параллельно? Если без явной проверки внутри? | ||
polosov 21 - 01.10.20 - 12:32 | (20) Не пробовал, но по идее должно запуститься. | ||
acht 22 - 01.10.20 - 12:34 | Блокировки делайте.
Иначе придет какой-нибудь обмен данными, который про ваши экзерсисы ну вообще ничего не знает и запишет вам всё по-своему. | ||
fisher 23 - 01.10.20 - 12:34 | (21) "Если ключ задан, то он должен быть уникальным среди ключей активных фоновых заданий, имеющих такое же имя метода, что и у данного фонового задания"
То есть может получится обойтись и без явной проверки внутри. | ||
fisher 24 - 01.10.20 - 12:35 | То есть можно попробовать тупо шарашить ручное фоновое и если оно с тем же ключом что и работающее, то по-идее просто не должно запуститься. | ||
mikecool 25 - 01.10.20 - 12:43 | (20) нет, или не запустится, или исключение выдаст | ||
mistеr 26 - 01.10.20 - 12:48 | (5) Задача выборки заданий из очереди не так проста как может показаться.
В первом приближении решается блокировкой чтения. ВЫБРАТЬ ПЕРВЫЕ 1 ... ... ГДЕ Обработано = Ложь ДЛЯ ИЗМЕНЕНИЯ | ||
DTX 4th 27 - 01.10.20 - 12:54 | Че-т не работает
https://i.imgur.com/84ks3kq.png
https://i.imgur.com/O7AubCP.png https://i.imgur.com/b5V52zE.png (26) Блокировка будет наложена на весь регистр? | ||
DTX 4th 28 - 01.10.20 - 12:55 | (27) Не тот скрин.
https://i.imgur.com/Jz6Tut3.png В регистре записей нет. Имя - измерение. Кроме одного измерения там ничего нет. | ||
DTX 4th 29 - 01.10.20 - 13:44 | Никто блокировки в повседневной жизни не использует?) | ||
Cyberhawk 30 - 01.10.20 - 14:11 | Если нужно ожидание, то упр. блокировка на любое не мешающее другим пространство.
Если отлуп нужен мгновенный - то ЗаблокироватьДанныеДляРедактирования на аналогно не мешающий другим объект БД. Рекламное место пустует | ||
DTX 4th 31 - 01.10.20 - 14:25 | |||
DTX 4th 32 - 01.10.20 - 14:25 | У РС режим управления блокировками - Управляемый | ||
Cyberhawk 33 - 01.10.20 - 15:24 | (31) Разглядывать картинки лично мне охоты нет, извиняй | ||
mistеr 34 - 01.10.20 - 15:57 | (27) На выбранные записи. | ||
Сияющий в темноте 35 - 01.10.20 - 20:18 | у фонового задания есть идентификатор и нельзя запустить несколько заданий с одинаковым идентификатором
дальше продолжать? | ||
Сияющий в темноте 36 - 01.10.20 - 20:20 | как бы,можно и с клиента запустить фончик и убедиться,что он один такой и твой. | ||
Сияющий в темноте 37 - 01.10.20 - 20:22 | просто,использование блокировки чего либо накладывает ограничение на использование транзакций. | ||
acht 38 - 01.10.20 - 23:42 | (37) Ээээ, что? | ||
Cyberhawk 39 - 02.10.20 - 14:55 | (38) Наверное, он про то, что мьютекс через упр. блокировку возможен только в рамках транзакции | ||
sr23 40 - 02.10.20 - 15:50 | ТС просто решил очередной раз понтануться, узнал новое слово) http://prntscr.com/urw5bq | ||
spock 41 - 02.10.20 - 15:59 | Например, так:
// file.h
//
class XXX {
public:
void doSomethingConcurrent() const;
private:
mutable std::recursive_mutex m_mutex; }; // file.cpp // void XXX:doSomethingConcurrent() const { std::unique_lock<std::recursive_mutex> localLocker(m_mutex);  // #uhooo now! } | ||
2mugik 42 - 02.10.20 - 19:21 | (0)делал обмен. сделал РС измененные объекты, куда подпиской при записи нужных объектов(справочники,документы) писался код объекта. При порционной выгрузке объектов РС блокировался по списку кодов выгружемых по 100 штук. |
|
Список тем форума |