Глобальные переменные

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
Здравствуйте товарищи!
Обнаружил я следующую странность:
Если создаю переменную вне проекта, и в кубиках принудительно(по умолчанию в кубике не отображается имя переменной, созданной вне проекта(см. скрин)) прописываю присвоение ей какого-либо значения, то переменная более, или менее хорошо работает в многопотокое.
Если же объявляю глобальную переменную внутри проекта, то она не выполняет возложенную на неё задачу.
А задача проста. Нужно увеличивать счетчик, и генерировать урл, на основе полученного значения. То есть проще говоря в каждом новом инстансе должна откруываться новая ссылка. Что-то может не понимаю? Может что делаю не так? Кто-то может показать как объявлять внутри проекта глобальные переменные В КУБИКАХ, без кодов каких-бы то ни было, так, что бы они в многопотоке работали нормально?
Буду благодарен за простенький проект, в котором наглядно все будет объяснено, т.к. нигде не нашел толковой инфы о том, как заставить работать глобальные переменные. Всюду велосипеды изобретают, либо коды используют, а я с ними не дружу пока к сожалению.
 

Вложения

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
Вот зараза а!?!? Все переменные, созданные вне проекта переместились в созданные в проекте, и опять хрен знает как работают! Что делать?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
нельзя создавать глобаку в окне переменных в проекте. В таком раскладе она не будет ничем отличаться от локальной. На старте проекта она всегда будет получать то значение, которое присвоено в окне переменных и от этого не будет никакого прока
 
  • Спасибо
Реакции: Botlab.su

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
да вроде если её и не будет то толку нет от этого. ты хоть познай хорошо глобальные чтобы так людям расписывать ну или уже пиши что надо каждывй раз перезагружать, а то слов много а ни одного примера
 
  • Спасибо
Реакции: Botlab.su

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 453
Благодарностей
5 913
Баллы
113
1.Поищите на форуме есть примеры использования глобальных переменных.
2. В вики есть статья про работу с переменными.
 
  • Спасибо
Реакции: Botlab.su

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
1.Поищите на форуме есть примеры использования глобальных переменных.
2. В вики есть статья про работу с переменными.
1. Нафоруме я не нашел ни одного примера как использовать переменные "...В КУБИКАХ, без кодов..."
2. В вики тоже не нашел. Потому пришлось сюда писать.
 
  • Спасибо
Реакции: Андрейка2020

copper12

Client
Регистрация
26.11.2016
Сообщения
1 111
Благодарностей
260
Баллы
63
  • Спасибо
Реакции: Botlab.su

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
Ребят! Сделайте кто-нибудь этот простейший шаблон, кто знает как! Дам денег на шоколадку к чаю!
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
кубики не помогут. Если происходит взятие значения и увеличение или какая-то другая обработка - этот промежуток действий нужно лочить.
C#:
lock(SyncObject) {
    try {
        //Если глобалка инициализирована - апаем на 1, возвращаем в переменну.
        var gb_count = project.GlobalVariables["namespace", "global_count"];
        gb_count.Value++;
        return gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        //Если нет - инииализируем со значением 0, возвращаем ноль
        project.GlobalVariables.SetVariable("namespace", "global_count", 0);
        return 0;
    }
}
Пользовался когда-то таким кодом для глобального счётчика
 
  • Спасибо
Реакции: btr, 4iloveg и Botlab.su

VladZen

Administrator
Команда форума
Регистрация
05.11.2014
Сообщения
22 453
Благодарностей
5 913
Баллы
113
речь о глобальных переменных. Хотелось бы увидеть наглядный пример их работы "...В КУБИКАХ, без кодов...".
Для какой задачи вы хотите получить пример? Глобальная переменная вообщем-то различается областью видимостью. И правильно вам сказали, если хотите сохранять её значение в многопотоке, то нужно лочить её в коде.
 
  • Спасибо
Реакции: Botlab.su

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
Для какой задачи вы хотите получить пример? Глобальная переменная вообщем-то различается областью видимостью. И правильно вам сказали, если хотите сохранять её значение в многопотоке, то нужно лочить её в коде.
Я писал выше для какой задачи. Нужно генерировать разные урл для каждого потока, а они у меня одинаковые частично генерятся. Но ответ я услышал. Кубиками без кода не получится. Придется в код въезжать))
Спасибо.
 

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
Если нет - инииализируем со значением 0, возвращаем ноль
А если мне нужно начальное значение задавать не 0, а то, что заданно в переменной nachalnoe_znachenie во входных настройках? Как тогда быть?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
C#:
lock(SyncObject) {
    try {
        //Если глобалка инициализирована - апаем на 1, возвращаем в переменну.
        var gb_count = project.GlobalVariables["namespace", "global_count"];
        gb_count.Value++;
        return gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        //Если нет - инииализируем со значением из переменной nachalnoe_znachenie, возвращаем его
        int start_value = int.Parse(project.Variables["nachalnoe_znachenie"].Value);
        project.GlobalVariables.SetVariable("namespace", "global_count", start_value);
        return start_value;
    }
}
 

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
C#:
lock(SyncObject) {
    try {
        //Если глобалка инициализирована - апаем на 1, возвращаем в переменну.
        var gb_count = project.GlobalVariables["namespace", "global_count"];
        gb_count.Value++;
        return gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        //Если нет - инииализируем со значением из переменной nachalnoe_znachenie, возвращаем его
        int start_value = int.Parse(project.Variables["nachalnoe_znachenie"].Value);
        project.GlobalVariables.SetVariable("namespace", "global_count", start_value);
        return start_value;
    }
}
Понял. Спасибо. Сохраню к себе в закладки. Буду пользоваться. По чём нынче на Руси шоколадки, или где Вы там проживаете?))
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Понял. Спасибо. Сохраню к себе в закладки. Буду пользоваться. По чём нынче на Руси шоколадки, или где Вы там проживаете?))
На здоровье. Без шоколада обойдусь)
 
  • Спасибо
Реакции: Botlab.su

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
На здоровье. Без шоколада обойдусь)
Тоже верно. Недавно смотрел одно из последних интервью ректора СПБГАУ Ефимова, так вот он говорит, что если бы сахар открыли сегодня, то никто бы не допустил его в продажу, и в пищепром. Дескать вреднота ещё та.
 

S16er1um

Client
Регистрация
14.04.2016
Сообщения
826
Благодарностей
240
Баллы
43
Не знаю в чём ваша проблема (адресую всем , кто отписывался в этом чате). Я во всех проэктах с глобальными переменными просто добавляю отдельную ветку, которая ведёт к заданию значения переменной. А во входящих настройках задаю параметр Select "Задать значение глобальной переменной {Да|Нет}". При первом старте проэкта - ставлю галочку на "Да" и оно через оператор If ведёт путь туда где я задаю значение. На этом путь заканчивается. Переменная задана. Шаблон закончен. Дальше ставлю галочку в "Нет" и шаблон просто выполняет дальнейшие действия, которые от него требуются. И никаких тебе кубиков с кодом и тд. С одной стороны геморно, что если хочешь задать значение глобальной - нужно всё остановить поставить галочку в "да" и выполнить шаблон 1 раз. с другой я в любой момент могу задать нужное мне значение переменной.
вот так
 
Последнее редактирование:

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Не знаю в чём ваша проблема (адресую всем , кто отписывался в этом чате). Я во всех проэктах с глобальными переменными просто добавляю отдельную ветку, которая ведёт к заданию значения переменной. А во входящих настройках задаю параметр Select "Задать значение глобальной переменной {Да|Нет}". При первом старте проэкта - ставлю галочку на "Да" и оно через оператор If ведёт путь туда где я задаю значение. На этом путь заканчивается. Переменная задана. Шаблон закончен. Дальше ставлю галочку в "Нет" и шаблон просто выполняет дальнейшие действия, которые от него требуются. И никаких тебе кубиков с кодом и тд. С одной стороны геморно, что если хочешь задать значение глобальной - нужно всё остановить поставить галочку в "да" и выполнить шаблон 1 раз. с другой я в любой момент могу задать нужное мне значение переменной.
вот так
если в проектах ты эту глобалку как-то в дальнейшем обрабатываешь (апаешь счётчик, напимер) и используешь её значение, то без лока возможна ситуация когда два потока одновременно возьмут для себя одно и то же значение и дважды его изменят. Т.е. если ты используешь глобалку как счётчик, и он равен 3 на данный момент, то эти два потока могут для себя одновременно взять значение 3, одновременно апнуть счётчик на +1. В результате в проектах значение счетчика взято 3 и 3, а должно 3 и 4, ну а счечик, как и должен, теперь равен 5
 

S16er1um

Client
Регистрация
14.04.2016
Сообщения
826
Благодарностей
240
Баллы
43
если в проектах ты эту глобалку как-то в дальнейшем обрабатываешь (апаешь счётчик, напимер) и используешь её значение, то без лока возможна ситуация когда два потока одновременно возьмут для себя одно и то же значение и дважды его изменят. Т.е. если ты используешь глобалку как счётчик, и он равен 3 на данный момент, то эти два потока могут для себя одновременно взять значение 3, одновременно апнуть счётчик на +1. В результате в проектах значение счетчика взято 3 и 3, а должно 3 и 4, ну а счечик, как и должен, теперь равен 5
Я эту ситуацию тоже учитываю ) я в потоке первым шагом присваиваю текущее значение глобальной переменной - локальной переменной, а затем увеличиваю сразу же значение глобальное на столько - сколько нужно. пока что во сколько потоков я бы не работал данные костыли ни разу не давали сбой
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Я эту ситуацию тоже учитываю ) я в потоке первым шагом присваиваю текущее значение глобальной переменной - локальной переменной, а затем увеличиваю сразу же значение глобальное на столько - сколько нужно. пока что во сколько потоков я бы не работал данные костыли ни разу не давали сбой
ты не поверишь, но когда я начинал работать с глобалками, я делал подобное. Более того, я даже ставил рандомную паузу до минуты, чтобы ещё снизить шанс параллели) Но это не всегда помогало
 
  • Спасибо
Реакции: S16er1um

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
Я эту ситуацию тоже учитываю ) я в потоке первым шагом присваиваю текущее значение глобальной переменной - локальной переменной, а затем увеличиваю сразу же значение глобальное на столько - сколько нужно. пока что во сколько потоков я бы не работал данные костыли ни разу не давали сбой
я делал такое. У меня не работает. Покажете шаблон в котором у Вас все отрабатывает?
 

S16er1um

Client
Регистрация
14.04.2016
Сообщения
826
Благодарностей
240
Баллы
43
upload_2017-2-2_17-30-13.png

Изначально , когда добавляете проэкт в зенопостер - нужно инициализировать глобальную переменную хотя бы нулём. или другим значением, которым хотите. тоесть 1 раз в шаблоне поставте галочку на Yes и прогоните его 1 раз. лишь один. больше не нужно. таким образом вы просто присвоете какое-то значение переменной и она не будет пустой.
upload_2017-2-2_17-31-51.png

1ый скрин показывает логику по которой у меня всё нормально отрабатывает. НО, ещё раз повторяю! Сначала нужно переменную инициализировать воспользовавшись скрином 2. Просто 1 раз в 1 поток запустите его. займёт это не больше секунды. Потом ставите галку в "No" и шаблон пойдёт другим путём и остальные инстансы уже будут тоже видеть эту глобалку
 

Botlab.su

Client
Регистрация
06.04.2015
Сообщения
145
Благодарностей
21
Баллы
18
Посмотреть вложение 18315
Изначально , когда добавляете проэкт в зенопостер - нужно инициализировать глобальную переменную хотя бы нулём. или другим значением, которым хотите. тоесть 1 раз в шаблоне поставте галочку на Yes и прогоните его 1 раз. лишь один. больше не нужно. таким образом вы просто присвоете какое-то значение переменной и она не будет пустой.
Посмотреть вложение 18316
1ый скрин показывает логику по которой у меня всё нормально отрабатывает. НО, ещё раз повторяю! Сначала нужно переменную инициализировать воспользовавшись скрином 2. Просто 1 раз в 1 поток запустите его. займёт это не больше секунды. Потом ставите галку в "No" и шаблон пойдёт другим путём и остальные инстансы уже будут тоже видеть эту глобалку
Спасибо. Теперь более ясна суть работы глобалки. Но это конечно костыли)) Если я заказчику скажу, что нужно так делать, то он скорее всего меня не поймет))
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Точно такая же проблема как у ТС.

У меня многопоточный парсер. Каждый поток парсит один "список данных". Каждый поток берёт значение для смещения по списку из глобальной переменной, каждый же поток её и увеличивает на 200 смещений.
Логика:
Проверяем инициализирована ли переменная в проекте, если да, то ждём две секунды и начинаем сбор. Если нет, то инициализируем глобальную переменную и организовываем рабочее пространство.
Следующим действием это идёт запрос к АПИ сайта с параметром глобальной переменной, который смещается каждый проход на 200.

Но в чём проблема, что в PM глобальная переменная подхватывается, а в ZP пишет, что она не ициализированна, из-за чего проект даёт сбой.

Но что я заметил, возможно совпадение, когда первый раз инициализируешь кубиком, то переменная получается "в проекте" и в ZP это отрабатывает, когда повторяешь действия в PM переменная переходит "вне проекта" и всё ломается.

Делал варианты как с C#, так и кубиками.


 

S16er1um

Client
Регистрация
14.04.2016
Сообщения
826
Благодарностей
240
Баллы
43
Точно такая же проблема как у ТС.

У меня многопоточный парсер. Каждый поток парсит один "список данных". Каждый поток берёт значение для смещения по списку из глобальной переменной, каждый же поток её и увеличивает на 200 смещений.
Логика:
Проверяем инициализирована ли переменная в проекте, если да, то ждём две секунды и начинаем сбор. Если нет, то инициализируем глобальную переменную и организовываем рабочее пространство.
Следующим действием это идёт запрос к АПИ сайта с параметром глобальной переменной, который смещается каждый проход на 200.

Но в чём проблема, что в PM глобальная переменная подхватывается, а в ZP пишет, что она не ициализированна, из-за чего проект даёт сбой.

Но что я заметил, возможно совпадение, когда первый раз инициализируешь кубиком, то переменная получается "в проекте" и в ZP это отрабатывает, когда повторяешь действия в PM переменная переходит "вне проекта" и всё ломается.

Делал варианты как с C#, так и кубиками.
По поводу работы с данным методом могу посоветовать, что проще будет просто брать ID пабликов из списка с удалением (просто заранее сохраните отдельно список с IDшниками групп, если вдруг что пойдёт не так).
Так каждый поток будет хватать свою группу и проблем не будет. А то слишком много глобальных.
даже если в группе 3 миллиона пользователей - на это уйдёт не много времени. count поставте 1000, и оффсет каждый круг на 1000 увеличивайте.
Это конечно же совет. Я же не знаю ваших целей. Просто мне так проще было работать
 
  • Спасибо
Реакции: Meteorburn

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
По поводу работы с данным методом могу посоветовать, что проще будет просто брать ID пабликов из списка с удалением (просто заранее сохраните отдельно список с IDшниками групп, если вдруг что пойдёт не так).
Так каждый поток будет хватать свою группу и проблем не будет. А то слишком много глобальных.
даже если в группе 3 миллиона пользователей - на это уйдёт не много времени. count поставте 1000, и оффсет каждый круг на 1000 увеличивайте.
Это конечно же совет. Я же не знаю ваших целей. Просто мне так проще было работать
Да, все верно вы говорите, у меня так и сделано в первом режиме многопотока. Я хочу чтобы было два режима.
Первый - это когда каждый поток парсит своё сообщество.
Второй - когда 10 потоков парсят одно сообщество.

Во втором режиме миллионики будут парсится еще быстрее.

Тут спортивный интерес такое реализовать и перфикционизм, буду рад помощи)
 

S16er1um

Client
Регистрация
14.04.2016
Сообщения
826
Благодарностей
240
Баллы
43
Что ж, тогда делайте как я уже говорил)
upload_2017-2-7_12-48-27.png


upload_2017-2-7_12-49-25.png

Как видите в начале шаблона стоит проверка на селект. Если мне нужно задать какие-то значения переменнным - я выбираю "Yes" и во входящих настройках задаю значения, которые мне нужны. Обычно, перед запуском шаблона я выставляю везде нули. Таким образом глобальные переменные инициализируются и в дальнейшем ошибок быть не должно. Прогнал таким образом шаблон 1 раз. (всё установится за 2-3 секунды) потом снял галочку. и запустил шаблон по нормальному пути. Вот и всё.
Попробуйте, ошибки должны пропасть. К тому же сможете в любой момент переназначить любую переменную глобальную
 
  • Спасибо
Реакции: Meteorburn

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Что ж, если вы на столько извращенец, то делайте как я уже говорил)
Посмотреть вложение 18400

Посмотреть вложение 18401
Как видите в начале шаблона стоит проверка на селект. Если мне нужно задать какие-то значения переменнным - я выбираю "Yes" и во входящих настройках задаю значения, которые мне нужны. Обычно, перед запуском шаблона я выставляю везде нули. Таким образом глобальные переменные инициализируются и в дальнейшем ошибок быть не должно. Прогнал таким образом шаблон 1 раз. (всё установится за 2-3 секунды) потом снял галочку. и запустил шаблон по нормальному пути. Вот и всё.
Попробуйте, ошибки должны пропасть. К тому же сможете в любой момент переназначить любую переменную глобальную
Благодрю, попробую Вашим способом))
 
Регистрация
26.05.2020
Сообщения
495
Благодарностей
172
Баллы
43
C#:
lock(SyncObject) {
    try {
        //Если глобалка инициализирована - апаем на 1, возвращаем в переменную.
        var gb_count = project.GlobalVariables["namespace", "global_count"];
        gb_count.Value++;
        return gb_count.Value;
    }
    catch (KeyNotFoundException ex) {
        //Если нет - инииализируем со значением из переменной nachalnoe_znachenie, возвращаем его
        int start_value = int.Parse(project.Variables["nachalnoe_znachenie"].Value);
        project.GlobalVariables.SetVariable("namespace", "global_count", start_value);
        return start_value;
    }
}
Подскажи по локу - глобалку потом как-то разлочивать нужно или она сама сбросится? Данный кубик с кодом нужно ВСЕГДА перед использованием ГП втыкать или единожды в начало шаблона?

Upd: не работает код (((
Такую ошибку пишет ZP Выполнение действия CSharp OwnCode. Не удается применить операнд "++" типа "string".

При этом в PM отрабатывает норм
 
Последнее редактирование:

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