Работа с профилями

ZbidZ

Client
Регистрация
26.12.2015
Сообщения
289
Благодарностей
5
Баллы
18
Спасибо тебе. Я просто уже закипел, ты реально простую ну действенную идею подсказал...я бы сейчас полез бы в переменные глобальные, я уже думал может с входными настройками что то сделать чтоб профиль рандомно выбирался...вообщем мыслей куча была...ну на первое время сделаю так как ты сказал!
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Я кажется понял схему....тоесть проект запускается...берет строчку...тут же ее удаляет из списка,(в это же время остальные потоки делают тоже самое)....и в конце проект строку взятую в переменную записать в этот же файл?!
лучше не в конце, а сразу добавлять
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 450
Благодарностей
8 678
Баллы
113
из этих 10 потоков не каждый отработает 100%, так как не всегда попадаются прокси которые открывают сайт, и инстанс закрывается...поэтому нужно будет постоянно отслеживать строчки эти....
те профили на которых шаб не отработал успешно, можно по Bad End возвращать обратно в список..
либо с не успешной ветки шаблона, которая последняя в шаблоне..

что то типа этого:

upload_2017-1-16_14-18-9.png
 
Последнее редактирование:

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
2-3 потока одну и ту же строчку не возьмут
могут, вероятность низкая, но всегда возможно
если брать строку с удалением - каждый поток возьмёт новую строку
взятие строки - это не атомарная операция, так что 2 потока могут взять 1 и ту же строку
Клево! :ay:Да уж, лучше бы я не начинал эту тему...чем дальше, тем голова кипеть прям от перегрева начинает:D...Подкинь плизз направление где я могу понять как работать с глобальной переменной....в курсе у ростоникса есть этот пункт с глобальными переменными?
используй lock(object) при взятии строки из списка
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Даже инкремент и дикремент не являются атомарными операциями, а ты про взятие строк рассказываешь. Что такое взятие строк?
Это как минимум 2 атомарные операции:
1) копирование значения в другую переменную
2) удаление строки из списка
Следовательно любой поток может копировать значение переменной, пока другой поток ещё не удалил её со списка. Процессор выделяет кванты времени каждому потоку, так что в любой момент работа может переключиться с одного потока на другой и будет 2 одинаковых значения в 2 потоках.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Даже инкремент и дикремент не являются атомарными операциями, а ты про взятие строк рассказываешь. Что такое взятие строк?
Это как минимум 2 атомарные операции:
1) копирование значения в другую переменную
2) удаление строки из списка
Следовательно любой поток может копировать значение переменной, пока другой поток ещё не удалил её со списка. Процессор выделяет кванты времени каждому потоку, так что в любой момент работа может переключиться с одного потока на другой и будет 2 одинаковых значения в 2 потоках.
не могут
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

public sealed class Program
{
    public static void Main()
    {
        List<int> lst_test = Enumerable.Range(1, 50000).ToList();
        object locker = new object();
        int count_real_remove = 0;

        Thread[] mass_threads = new Thread[2];
        for (int i = 0; i < 2; i++)
        {
            mass_threads[i] = new Thread(() =>
            {
                do
                {
                    try
                    {
                        int test = lst_test[0];
                        lst_test.RemoveAt(0);

                        //потокобезопасное инкрементирование значения
                        Interlocked.Increment(ref count_real_remove);
                    }
                    catch(ArgumentOutOfRangeException ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                while (lst_test.Count > 0);
            });
        }

        for (int i = 0; i < 2; i++)
            mass_threads[i].Start();

        mass_threads[0].Join();
        mass_threads[1].Join();

        Console.WriteLine(count_real_remove.ToString());
        Console.Read();
    }
}
Результат:
50241 (изначально операций было 50000), так что могут 2 потока взять 1 и ту же строку
Плюс ещё ошибка выскакивает временами ArgumentOutOfRangeException, что означает, что поток пытается получить строку, которой уже нет.
P.S.: стоит поставить lock и значений становится ровно 50000.
 
Последнее редактирование:

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
Результат:
50241 (изначально операций было 50000), так что могут 2 потока взять 1 и ту же строку
Плюс ещё ошибка выскакивает временами ArgumentOutOfRangeException, что означает, что поток пытается получить строку, которой уже нет.
А к чему этот код вообще? Проверяй стандартный кубик!

Screenshot_1.png
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
amyboose, в общем, не вводи людей в заблуждение!
ТС, как тебе уже ответили, при использовании стандартного экшена "Взятие строки из списка с удалением", у каждого потока будет своя строка и никаких ошибок не возникнет.
 
  • Спасибо
Реакции: doc

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

public sealed class Program
{
    public static void Main()
    {
        List<int> lst_test = Enumerable.Range(1, 50000).ToList();
        object locker = new object();
        int count_real_remove = 0;

        Thread[] mass_threads = new Thread[2];
        for (int i = 0; i < 2; i++)
        {
            mass_threads[i] = new Thread(() =>
            {
                do
                {
                    try
                    {
                        int test = lst_test[0];
                        lst_test.RemoveAt(0);

                        //потокобезопасное инкрементирование значения
                        Interlocked.Increment(ref count_real_remove);
                    }
                    catch(ArgumentOutOfRangeException ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
                while (lst_test.Count > 0);
            });
        }

        for (int i = 0; i < 2; i++)
            mass_threads[i].Start();

        mass_threads[0].Join();
        mass_threads[1].Join();

        Console.WriteLine(count_real_remove.ToString());
        Console.Read();
    }
}
Результат:
50241 (изначально операций было 50000), так что могут 2 потока взять 1 и ту же строку
Плюс ещё ошибка выскакивает временами ArgumentOutOfRangeException, что означает, что поток пытается получить строку, которой уже нет.
P.S.: стоит поставить lock и значений становится ровно 50000.
кто о чём, а вшивый о бане.
ТС азы пытается постигнуть, ты коды зачем-то лепишь. Ожидаемо
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
кто о чём, а вшивый о бане.
ТС азы пытается постигнуть, ты коды зачем-то лепишь. Ожидаемо
Тебе бы пора подумать хорошенько и понять, что я ответил тебе на твой пост о том, что 2 потока не могут взять 1 строку, а не ТСу. Нигде не написано, что Project.Lists является/не является просто графической оберткой обычного листа с наличием/отсутствием блокировки потока, так что твои слова тоже не доказывают обратного.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Тебе бы пора подумать хорошенько и понять, что я ответил тебе на твой пост о том, что 2 потока не могут взять 1 строку, а не ТСу. Нигде не написано, что Project.Lists является/не является просто графической оберткой обычного листа с наличием/отсутствием блокировки потока, так что твои слова тоже не доказывают обратного.
ты вроде не глупый человек, но пишешь подобное. Списки - это основа зеннопстера. Если бы в стандартных экшенах н ебыло бы реализована блокировка - кому вообще впарился бы зеннопостер? Купил зенно, и чтобы самую обыденную, простую вещь реализовать пошёл код изучать? Ты серьёзно?
Как я написал выше, не считаю тебя глупым. Считаю, что тебе стало скушно, и ты решил кому-нибудь на уши подсесть с рассказами про пост гет или C#)
Уже на первом своём "не может" я понимал, что в итоге ты выложишь код, чтобы доказать то, что доказывать было не нужно. Вопрос был в том, насколько тебя хватит. Всего два "не может" понадобилось)
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
ты вроде не глупый человек, но пишешь подобное. Списки - это основа зеннопстера. Если бы в стандартных экшенах н ебыло бы реализована блокировка - кому вообще впарился бы зеннопостер? Купил зенно, и чтобы самую обыденную, простую вещь реализовать пошёл код изучать? Ты серьёзно?
Как я написал выше, не считаю тебя глупым. Считаю, что тебе стало скушно, и ты решил кому-нибудь на уши подсесть с рассказами про пост гет или C#)
Уже на первом своём "не может" я понимал, что в итоге ты выложишь код, чтобы доказать то, что доказывать было не нужно. Вопрос был в том, насколько тебя хватит. Всего два "не может" понадобилось)
Код:
project.Lists["test"].AddRange(Enumerable.Range(1, 50000).Select(x => x.ToString()));
        object locker = new object();
        int count_real_remove = 0;
        Thread[] mass_threads = new Thread[2];
        for (int i = 0; i < 2; i++)
        {
            mass_threads[i] = new Thread(() =>
            {
                do
                {
                    try
                    {
                        string test = project.Lists["test"][0];
                        project.Lists["test"].RemoveAt(0);
                        //потокобезопасное инкрементирование значения
                        Interlocked.Increment(ref count_real_remove);
                    }
                    catch(ArgumentOutOfRangeException ex)
                    {
                        project.SendInfoToLog(ex.Message, false);
                    }
                }
                while (project.Lists["test"].Count > 0);
            });
        }
        for (int i = 0; i < 2; i++)
            mass_threads[i].Start();
        mass_threads[0].Join();
        mass_threads[1].Join();
        project.SendInfoToLog(count_real_remove.ToString(), false);
Результаты:


Так что твои слова оказались неверными. Лист от зеннолаба работает без lock.
 
  • Спасибо
Реакции: DmitryAk

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Код:
project.Lists["test"].AddRange(Enumerable.Range(1, 50000).Select(x => x.ToString()));
        object locker = new object();
        int count_real_remove = 0;
        Thread[] mass_threads = new Thread[2];
        for (int i = 0; i < 2; i++)
        {
            mass_threads[i] = new Thread(() =>
            {
                do
                {
                    try
                    {
                        string test = project.Lists["test"][0];
                        project.Lists["test"].RemoveAt(0);
                        //потокобезопасное инкрементирование значения
                        Interlocked.Increment(ref count_real_remove);
                    }
                    catch(ArgumentOutOfRangeException ex)
                    {
                        project.SendInfoToLog(ex.Message, false);
                    }
                }
                while (project.Lists["test"].Count > 0);
            });
        }
        for (int i = 0; i < 2; i++)
            mass_threads[i].Start();
        mass_threads[0].Join();
        mass_threads[1].Join();
        project.SendInfoToLog(count_real_remove.ToString(), false);
Результаты:


Так что твои слова оказались неверными. Лист от зеннолаба работает без lock.
О божечки, ты, вырезано_цензурой, можешь взять стандартный экш, который привёл в пример товарищ Dimionix, и провести тесты с ним? Для чего ты лепишь мне эти коды?
Ты сейчас прикидываешься или реально такой? Прошу подойти к вопросу со всей ответственностью, ответ очень важен
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 100
Баллы
113
Так что твои слова оказались неверными. Лист от зеннолаба работает без lock.
Бля, опять куда-то полез! Объясни, зачем? Думаю, что ты сам не знаешь, как и что работает, пытаешься разобраться, но впариваешь так, что типа всё знаешь.
http://zennolab.com/discussion/threads/poisk-po-spiskam-i-tablicam-cherez-c-makros.10734/#post-65300
 
Последнее редактирование:

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
О божечки, ты, вырезано_цензурой, можешь взять стандартный экш, который привёл в пример товарищ Dimionix, и провести тесты с ним? Для чего ты лепишь мне эти коды?
Ты сейчас прикидываешься или реально такой? Прошу подойти к вопросу со всей ответственностью, ответ очень важен
Ахахаах, смешной, я тебе уже в коде привел то же, что сделает оригинальный кубик. Если ты не знал, то любой кубик трансформируется в c# код и ты думаешь тогда разработчики сделали бы lock для каждой части? Нет конечно. Я уже тебе доказал все, если хочешь опровергнуть, делай кубики и доказывай обратное.

Бля, опять куда-то полез! Объясни, зачем! Думаю, что ты сам не знаешь, как и что работает, пытаешься разобраться, но впариваешь так, что типа всё знаешь.
http://zennolab.com/discussion/threads/poisk-po-spiskam-i-tablicam-cherez-c-makros.10734/#post-65300
И ты этим хочешь доказать, что непривязанный к файлу список будет работать без lock?
Тогда тебе стоит прочитать в гугле про разделяемые объекты и экземпляры. Даже на примере создания объекта класса или статического класса.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Ахахаах, смешной, я тебе уже в коде привел то же, что сделает оригинальный кубик. Если ты не знал, то любой кубик трансформируется в c# код и ты думаешь тогда разработчики сделали бы lock для каждой части? Нет конечно. Я уже тебе доказал все, если хочешь опровергнуть, делай кубики и доказывай обратное.


И ты этим хочешь доказать, что непривязанный к файлу список будет работать без lock?
Тогда тебе стоит прочитать в гугле про разделяемые объекты и экземпляры. Даже на примере создания объекта класса или статического класса.

я не знаю, зачем я трачу на тебя время. Походу не прикидываешься.
ТС, как писали выше
при использовании стандартного экшена "Взятие строки из списка с удалением", у каждого потока будет своя строка и никаких ошибок не возникнет.
 
  • Спасибо
Реакции: Dimionix

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 450
Благодарностей
8 678
Баллы
113
всем попкорн и кока-кола мир! :dw:
стала интересна тема и я не поленился и решил проверить с помощью кубиков..
результат - все как сказали Dimionix и doc.. :-)
дубли не берет..
проверял в 10 и 40 потоков выборку из списка привязанного к файлу на 50.000 строк..
 
Последнее редактирование:
  • Спасибо
Реакции: Dimionix

tom_dwan

Пользователь
Регистрация
09.08.2019
Сообщения
52
Благодарностей
3
Баллы
8
не играет роли, можно в ту же папку, где шаблон находится,
можно в подпапку, а можно в совершенно любую папку,
зеннопостер насчет этого оч. гибок..
я бы выбрал вариант с подпапкой, чтобы не было свалки..
Подскажите пожалуйста:bh:
У меня есть аккаунт сервиса.
Я захожу в сервис, авторизация прошла какой командой или чем я могу сохранить { Куки, Сокс, Профиль } что бы потом я сразу заходил уже в профиль без авторизации и делал свои задачи в этой сервисе
Буду очень благодарен:bp:
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 450
Благодарностей
8 678
Баллы
113
Подскажите пожалуйста:bh:
У меня есть аккаунт сервиса.
Я захожу в сервис, авторизация прошла какой командой или чем я могу сохранить { Куки, Сокс, Профиль } что бы потом я сразу заходил уже в профиль без авторизации и делал свои задачи в этой сервисе
Буду очень благодарен:bp:
upload_2019-8-11_16-19-11.png
 
  • Спасибо
Реакции: tom_dwan

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