конструкция lock(SyncObjects.ListSyncer)

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Подскажите lock(SyncObjects.ListSyncer) лочит файлик в рамках одного шаблона или в рамках полностью зеннопостера?
Если у меня 3 разных шаблона работают с 1 табличкой эта конструкция уместна?
спс
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
лочит, но не файлик, а выполнение кода внутри этой конструкции.
для блокировки разных шаблонов, я бы наверно не рисковал и сделал бы лок через глобальные переменные.
хотя SyncObjects.ListSyncer вроде как общий глобальный объект для всего зеннопостера идет... но это лучше проверить на тестовых шаблонах
 
  • Спасибо
Реакции: arbplv

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 498
Благодарностей
3 364
Баллы
113
Подскажите lock(SyncObjects.ListSyncer) лочит файлик в рамках одного шаблона или в рамках полностью зеннопостера?
Если у меня 3 разных шаблона работают с 1 табличкой эта конструкция уместна?
спс
Используйте глоб. переменные:
 
  • Спасибо
Реакции: arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Используйте глоб. переменные:
чет не понял, нужно несколько раз перезаписывать эту глобальную переменную? условно если true то можно работать с этим куском кода, если false, то ждем, а в других шаблонах в цикле просто ждать пока она не станет true? такая логика?
 

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
чет не понял, нужно несколько раз перезаписывать эту глобальную переменную?
Она (глобальная переменная) храниться в памяти и доступна для всех шаблонов на Вашем ПК.
Если в схеме несколько ПК, то придется паралелить через API сервис например на отдельном хостинге или на уровне БД.
Например в Postgresql можно одним запросом изменить и получить изменный результат - БД версионность работает из коробки (нагрузка не большая).

Я думаю, что глобальная переменная - это строка, как и обычная переменная. Можно поставить 0 если заблокировано, 1 если разблокировано.
Например можно сделать не прерывный цикл while(true) {конструкция} цикл будет чекать переменную на 0, если нет то делать небольшую паузу и ждать таким образом своей очереди.
Но так же надо продумать механизм, который будет возвращать 1 в случае краха потока. Допустим Вы запустили, и получилось, что переменная осталась в 0 и все потоки будут ждать когда она станет 1 - а вернуть обработано в работу некому.
В связи с чем я бы сделал счетчик, который считал бы количество проверок и в случае исчерпания лимита - выставлял бы 1 в глобальную переменную.

Если у меня 3 разных шаблона работают с 1 табличкой эта конструкция уместна?
Таблица гугл или просто таблица?

UPD: я бы перенес таблицу в БД и не мучался.
 
  • Спасибо
Реакции: arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Она (глобальная переменная) храниться в памяти и доступна для всех шаблонов на Вашем ПК.
Если в схеме несколько ПК, то придется паралелить через API сервис например на отдельном хостинге или на уровне БД.
Например в Postgresql можно одним запросом изменить и получить изменный результат - БД версионность работает из коробки (нагрузка не большая).

Я думаю, что глобальная переменная - это строка, как и обычная переменная. Можно поставить 0 если заблокировано, 1 если разблокировано.
Например можно сделать не прерывный цикл while(true) {конструкция} цикл будет чекать переменную на 0, если нет то делать небольшую паузу и ждать таким образом своей очереди.
Но так же надо продумать механизм, который будет возвращать 1 в случае краха потока. Допустим Вы запустили, и получилось, что переменная осталась в 0 и все потоки будут ждать когда она станет 1 - а вернуть обработано в работу некому.
В связи с чем я бы сделал счетчик, который считал бы количество проверок и в случае исчерпания лимита - выставлял бы 1 в глобальную переменную.

Таблица гугл или просто таблица?
В целом я так и думал, пока 1 комп и бд не надо, задачу вроде как выше описал, есть несколько разных шаблонов, которые условно работают с 1 списком, условно берется строка с удалением, и вот задача чтобы строка была взята 1 раз. Внутри 1 шаблона и многопотока решается это lock(SyncObjects.ListSyncer) , а вот если шаблонов несколько по всей видимости решение как написали вы выше, просто использовать переменную-флаг. Я верил что lock(SyncObjects.ListSyncer) чуть умнее и если в этом кусочке есть условно список, то лочится именно список, а не этот кусочек кода)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
не надо ничего в глобалку пихать. достаточно сделать объект в начале шаблона и потом в конструкции lock использовать этот объект. и во всех шаблонах будет лок страбатывать нормально
 
  • Спасибо
Реакции: material и Yuriy Zymlex

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
вот эта конструкция

92662

вот так заюзать

C#:
var syncObject = project.GlobalVariables["test_namespace","my_sync_object"].Value;
lock (syncObject )
{
    тута индуский код
}
 
  • Спасибо
Реакции: material и arbplv

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
lock(SyncObjects.ListSyncer)
Это лучше не использовать, потому на каждый объект (файл, список, таблица) должна быть своя блокировка.

Вот хороший вариант.

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

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
Это лучше не использовать, потому на каждый объект (файл, список, таблица) должна быть своя блокировка.

Вот хороший вариант.

Короче можно по разному сделать, можно через глобальную переменную, можно через статический метод.
ничего хорошего там нет. между разными проектами не будет работать. надо делать блокировку через глобалки и не выдумывать лишнего
 
  • Спасибо
Реакции: material

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
между разными проектами не будет работать.
Да точно, работать между проектами не будет. Тогда остается только блокировка через глобальную переменную.

А существует же какой-то магический метод STATIC, где-то я читал (кстати Ваш комментарий :-) )
 

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
вот эта конструкция

Посмотреть вложение 92662

вот так заюзать

C#:
var syncObject = project.GlobalVariables["test_namespace","my_sync_object"].Value;
lock (syncObject )
{
    тута индуский код
}
да, так мне сильно больше нравится))) чем писать кучу циклов с таймингами...
мне так надо гугловскую табличку лочить и лист с проксями (в рамках этой задачи 1 лист на 3 шаблона)
спс будем юзать)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
Да точно, работать между проектами не будет. Тогда остается только блокировка через глобальную переменную.

А существует же какой-то магический метод STATIC, где-то я читал (кстати Ваш комментарий :-) )
обучаемся по ходу возникновения проблем :bk:
STATIC работает.... но только если ID объектов одинаковые... а они одинаковые только в одной сборке... а разные шаблоны это 100% разные сборки.
 
  • Спасибо
Реакции: Yuriy Zymlex и arbplv

bigloafer

Client
Регистрация
23.07.2020
Сообщения
243
Благодарностей
76
Баллы
28
чем писать кучу циклов с таймингами...
Я проверок не избежать.
Ну смотрите: Вы запустили шаблон, поток грохнулся в инструкции глобальной переменной успев ее установить в 1. Все остальные запуски не смогут получить доступ к объекту. Остановка и запуск шаблона не приведут к решению проблемы.
Можно пробовать перезагрузить постер - но у меня не всегда получалось как-то сбросить значение переменной.
Вот такие пирожки.

Вот пример: У строки в БД есть три статуса:
1. Ждем
2. Работает
3. Завершено
Я в БД беру строку в обработку (LIMIT 1 с флагом "Ждем") и сразу проставляю ей флаг "Работает". Когда шаблон отработал со строкой проставляю статус "Завершено".
Допустим строк в БД 1 млрд штук. После 1 млрд запуском, Вы обнаружите в БД записи со статусом "Работает" - это значит скрипт не дошел до места где ему проставляется статус "Завершено".

Те кто понимают аксиому: чем больше строк в обработке, тем выше вероятность ошибки, ставят в шаблоне Bud End и из него делают кубик C# чтобы проставить строке статус "Ждем" - но и это не исключает возможность выявления статуса "Работает" после 1 млрд запусков. Это значит, что ZP наглушман завис, или не сработала инструкция Bud End.
Причин может быть масса почему это происходит.
 
  • Спасибо
Реакции: arbplv

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 718
Баллы
113
Я проверок не избежать.
Ну смотрите: Вы запустили шаблон, поток грохнулся в инструкции глобальной переменной успев ее установить в 1. Все остальные запуски не смогут получить доступ к объекту. Остановка и запуск шаблона не приведут к решению проблемы.
Можно пробовать перезагрузить постер - но у меня не всегда получалось как-то сбросить значение переменной.
Вот такие пирожки.

Вот пример: У строки в БД есть три статуса:
1. Ждем
2. Работает
3. Завершено
Я в БД беру строку в обработку (LIMIT 1 с флагом "Ждем") и сразу проставляю ей флаг "Работает". Когда шаблон отработал со строкой проставляю статус "Завершено".
Допустим строк в БД 1 млрд штук. После 1 млрд запуском, Вы обнаружите в БД записи со статусом "Работает" - это значит скрипт не дошел до места где ему проставляется статус "Завершено".

Те кто понимают аксиому: чем больше строк в обработке, тем выше вероятность ошибки, ставят в шаблоне Bud End и из него делают кубик C# чтобы проставить строке статус "Ждем" - но и это не исключает возможность выявления статуса "Работает" после 1 млрд запусков. Это значит, что ZP наглушман завис, или не сработала инструкция Bud End.
Причин может быть масса почему это происходит.
все решается обычным полем с временем установки. в простонародье, таймштамп. при определенном таймауте таймштампа, метка признается недействительной и остальные потоки начинают работать в обычном режиме.
но в текущей задаче это излишний геморой. достаточно обычного лока через глобалку.
 
  • Спасибо
Реакции: bigloafer и arbplv

arbplv

Client
Регистрация
28.03.2020
Сообщения
373
Благодарностей
23
Баллы
18
Я проверок не избежать.
Ну смотрите: Вы запустили шаблон, поток грохнулся в инструкции глобальной переменной успев ее установить в 1. Все остальные запуски не смогут получить доступ к объекту. Остановка и запуск шаблона не приведут к решению проблемы.
Можно пробовать перезагрузить постер - но у меня не всегда получалось как-то сбросить значение переменной.
Вот такие пирожки.

Вот пример: У строки в БД есть три статуса:
1. Ждем
2. Работает
3. Завершено
Я в БД беру строку в обработку (LIMIT 1 с флагом "Ждем") и сразу проставляю ей флаг "Работает". Когда шаблон отработал со строкой проставляю статус "Завершено".
Допустим строк в БД 1 млрд штук. После 1 млрд запуском, Вы обнаружите в БД записи со статусом "Работает" - это значит скрипт не дошел до места где ему проставляется статус "Завершено".

Те кто понимают аксиому: чем больше строк в обработке, тем выше вероятность ошибки, ставят в шаблоне Bud End и из него делают кубик C# чтобы проставить строке статус "Ждем" - но и это не исключает возможность выявления статуса "Работает" после 1 млрд запусков. Это значит, что ZP наглушман завис, или не сработала инструкция Bud End.
Причин может быть масса почему это происходит.
да да да) у меня так и реализовано с гугловской табличкой, берем строчку, сразу втыкаем ей статус в работе ну и логика как выше написали
92672
+ через сводную табличку легко посмотреть статусы что и как...
92673
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 498
Благодарностей
3 364
Баллы
113

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)