Используйте глоб. переменные:Подскажите lock(SyncObjects.ListSyncer) лочит файлик в рамках одного шаблона или в рамках полностью зеннопостера?
Если у меня 3 разных шаблона работают с 1 табличкой эта конструкция уместна?
спс
чет не понял, нужно несколько раз перезаписывать эту глобальную переменную? условно если true то можно работать с этим куском кода, если false, то ждем, а в других шаблонах в цикле просто ждать пока она не станет true? такая логика?Используйте глоб. переменные:
Snippets/Сниппеты/[Логика]/[Блокировка между потоками, шаблонами]/Синхронизация шаблонов через глобальные переменные.cs at master · ZennoHelpers/Snippets · GitHub
Коллекция сниппетов пользователей ZennoPoster. Contribute to ZennoHelpers/Snippets development by creating an account on GitHub.github.com
Она (глобальная переменная) храниться в памяти и доступна для всех шаблонов на Вашем ПК.чет не понял, нужно несколько раз перезаписывать эту глобальную переменную?
Таблица гугл или просто таблица?Если у меня 3 разных шаблона работают с 1 табличкой эта конструкция уместна?
В целом я так и думал, пока 1 комп и бд не надо, задачу вроде как выше описал, есть несколько разных шаблонов, которые условно работают с 1 списком, условно берется строка с удалением, и вот задача чтобы строка была взята 1 раз. Внутри 1 шаблона и многопотока решается это lock(SyncObjects.ListSyncer) , а вот если шаблонов несколько по всей видимости решение как написали вы выше, просто использовать переменную-флаг. Я верил что lock(SyncObjects.ListSyncer) чуть умнее и если в этом кусочке есть условно список, то лочится именно список, а не этот кусочек кода)Она (глобальная переменная) храниться в памяти и доступна для всех шаблонов на Вашем ПК.
Если в схеме несколько ПК, то придется паралелить через API сервис например на отдельном хостинге или на уровне БД.
Например в Postgresql можно одним запросом изменить и получить изменный результат - БД версионность работает из коробки (нагрузка не большая).
Я думаю, что глобальная переменная - это строка, как и обычная переменная. Можно поставить 0 если заблокировано, 1 если разблокировано.
Например можно сделать не прерывный цикл while(true) {конструкция} цикл будет чекать переменную на 0, если нет то делать небольшую паузу и ждать таким образом своей очереди.
Но так же надо продумать механизм, который будет возвращать 1 в случае краха потока. Допустим Вы запустили, и получилось, что переменная осталась в 0 и все потоки будут ждать когда она станет 1 - а вернуть обработано в работу некому.
В связи с чем я бы сделал счетчик, который считал бы количество проверок и в случае исчерпания лимита - выставлял бы 1 в глобальную переменную.
Таблица гугл или просто таблица?
Это лучше не использовать, потому на каждый объект (файл, список, таблица) должна быть своя блокировка.lock(SyncObjects.ListSyncer)
ничего хорошего там нет. между разными проектами не будет работать. надо делать блокировку через глобалки и не выдумывать лишнегоЭто лучше не использовать, потому на каждый объект (файл, список, таблица) должна быть своя блокировка.
Вот хороший вариант.
Короче можно по разному сделать, можно через глобальную переменную, можно через статический метод.
Да точно, работать между проектами не будет. Тогда остается только блокировка через глобальную переменную.между разными проектами не будет работать.
да, так мне сильно больше нравится))) чем писать кучу циклов с таймингами...вот эта конструкция
Посмотреть вложение 92662
вот так заюзать
C#:var syncObject = project.GlobalVariables["test_namespace","my_sync_object"].Value; lock (syncObject ) { тута индуский код }
обучаемся по ходу возникновения проблемДа точно, работать между проектами не будет. Тогда остается только блокировка через глобальную переменную.
А существует же какой-то магический метод STATIC, где-то я читал (кстати Ваш комментарий )
Я проверок не избежать.чем писать кучу циклов с таймингами...
все решается обычным полем с временем установки. в простонародье, таймштамп. при определенном таймауте таймштампа, метка признается недействительной и остальные потоки начинают работать в обычном режиме.Я проверок не избежать.
Ну смотрите: Вы запустили шаблон, поток грохнулся в инструкции глобальной переменной успев ее установить в 1. Все остальные запуски не смогут получить доступ к объекту. Остановка и запуск шаблона не приведут к решению проблемы.
Можно пробовать перезагрузить постер - но у меня не всегда получалось как-то сбросить значение переменной.
Вот такие пирожки.
Вот пример: У строки в БД есть три статуса:
1. Ждем
2. Работает
3. Завершено
Я в БД беру строку в обработку (LIMIT 1 с флагом "Ждем") и сразу проставляю ей флаг "Работает". Когда шаблон отработал со строкой проставляю статус "Завершено".
Допустим строк в БД 1 млрд штук. После 1 млрд запуском, Вы обнаружите в БД записи со статусом "Работает" - это значит скрипт не дошел до места где ему проставляется статус "Завершено".
Те кто понимают аксиому: чем больше строк в обработке, тем выше вероятность ошибки, ставят в шаблоне Bud End и из него делают кубик C# чтобы проставить строке статус "Ждем" - но и это не исключает возможность выявления статуса "Работает" после 1 млрд запусков. Это значит, что ZP наглушман завис, или не сработала инструкция Bud End.
Причин может быть масса почему это происходит.
да да да) у меня так и реализовано с гугловской табличкой, берем строчку, сразу втыкаем ей статус в работе ну и логика как выше написалиЯ проверок не избежать.
Ну смотрите: Вы запустили шаблон, поток грохнулся в инструкции глобальной переменной успев ее установить в 1. Все остальные запуски не смогут получить доступ к объекту. Остановка и запуск шаблона не приведут к решению проблемы.
Можно пробовать перезагрузить постер - но у меня не всегда получалось как-то сбросить значение переменной.
Вот такие пирожки.
Вот пример: У строки в БД есть три статуса:
1. Ждем
2. Работает
3. Завершено
Я в БД беру строку в обработку (LIMIT 1 с флагом "Ждем") и сразу проставляю ей флаг "Работает". Когда шаблон отработал со строкой проставляю статус "Завершено".
Допустим строк в БД 1 млрд штук. После 1 млрд запуском, Вы обнаружите в БД записи со статусом "Работает" - это значит скрипт не дошел до места где ему проставляется статус "Завершено".
Те кто понимают аксиому: чем больше строк в обработке, тем выше вероятность ошибки, ставят в шаблоне Bud End и из него делают кубик C# чтобы проставить строке статус "Ждем" - но и это не исключает возможность выявления статуса "Работает" после 1 млрд запусков. Это значит, что ZP наглушман завис, или не сработала инструкция Bud End.
Причин может быть масса почему это происходит.
Нет, это любой объект C# (dynamic), что удобно.Я думаю, что глобальная переменная - это строка