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