Re[5]: WebClient не всегда работает?
От: vvlad.net  
Дата: 24.03.13 12:54
Оценка: -1
Здравствуйте, yniker, Вы писали:

Y>Здравствуйте, vvlad.net, Вы писали:


VN>>Здравствуйте, yniker, Вы писали:


Y>>>Тоже рассматриваю вариант, но пока не могу его применить логически для своей задачи. Не могу толком понять применимость.


VN>>Уже понятно.


VN>>разбей твою задачу на подзадачи:

VN>>- вместо скачать-проанализировать-скачать-сохранить
VN>>- станет:

VN>>1. producer pushes download task to queue

VN>>2. consumer takes the task, downloads
VN>>3. consumer becomes producer — pushes downloaded result to queue
VN>>4. consumer (another one maybe) — takes the downloaded result, analyses it
VN>>5. consumer becomes producer — pushes download task (analyse result) to queue
VN>>6. consumer takes the task to download, pushes thre sult to queue
VN>>7. consumer takes the result, saves it to db

VN>>that's all.


VN>>Количество консумеров — количество потоков, не будет простоя.

VN>>В самих консумерах юзай пока синхронный вариант, тебе опыта не хватит заюзать асинхронный,
VN>>да и не особо это и критично для твоей задачи.

Y>Проанализировав ваш ответ (патерн), это не правильное решение.

Y>Что даст этот патерн.
Y>Создаем 1 поток. который подает данные.
Y>Создаем 1000 потоков которые читают данные с первого потока и делают загрузку, анализ.
Y>И совсем не критично, ну подумаешь 1гиг памяти для потоков выделится просто так, процессор будет нагружен переключением потоков, и самой интересное что 99% вообще эти потоки ничего делать не будут, а просто синхронно ждать.
Y>А Microsoft путь и дальше придумывает свои Task, ThreadPool, await и асинхронные операции. Мы будем плодить потоки.

Мда, парниша. А как ты хочешь делать одновременные загрузки и анализ? в одном потоке???

Почитай про многопоточность и IO. Особенно про последнее. Я тебе в письме отписывал — пока работает IO операция, спит поток, который ее вызвал, зато активируется другой, который в этот момент делает анализ чего-либо. Если тебе стремно создавать 1000 потоков (по метру памяти на каждый), то тогда тебе надо поискать форумы по эрлангу.
Я, в принципе, мог бы сделать вариант, когда потоки не ждут (запустили IO, ушли делать другие дела), это сэкономит нам количество потоков (но время выполнения останется практически тем-же). Да и то, что я прислал — уже для такого подходит.
Re[8]: WebClient не всегда работает?
От: yniker  
Дата: 24.03.13 15:42
Оценка: +1
Здравствуйте, vvlad.net, Вы писали:

VN>Здравствуйте, yniker, Вы писали:



VN>>>Мда, парниша. А как ты хочешь делать одновременные загрузки и анализ? в одном потоке???


VN>>>Почитай про многопоточность и IO. Особенно про последнее. Я тебе в письме отписывал — пока работает IO операция, спит поток, который ее вызвал, зато активируется другой, который в этот момент делает анализ чего-либо. Если тебе стремно создавать 1000 потоков (по метру памяти на каждый), то тогда тебе надо поискать форумы по эрлангу.

VN>>>Я, в принципе, мог бы сделать вариант, когда потоки не ждут (запустили IO, ушли делать другие дела), это сэкономит нам количество потоков (но время выполнения останется практически тем-же). Да и то, что я прислал — уже для такого подходит.

Y>>Не получил от Вас письма, буду благодарен если еще раз перешлете, (в спаме тоже нет.)

Y>>Спасибо. y n i k e r @ g m a i l . c o m

VN>Ок, перешлю.


Спасибо за код, но это не то.
Да хороший красивый патерн, возможно приятней чем
(Создаем 1 поток. который подает данные.
Создаем 1000 потоков которые читают данные с первого потока и делают загрузку, анализ.)

Там тоже создаются потоки, ну по крайней мере в той реализации.

Так я сразу приведу пример, чтобы по сто раз не возвращаться к патерну и к куче потоков.
Я не спорю несколько или разумное кол-во потоков все равно будет. В идеале равное кол-ву процесоров.

У меня есть сервер на 10000 клиентов, с 32 ОС. Всем надо работать "паралельно, одновременно".
1. ОС не даст создать 10000 потоков.
2. Работать не будет? БУДЕТ! и всего в нескольких потоках.
Да и поможет здесь не форумы по по эрлангу, а асинхронная работа.
Чудеса? Нет.
Советую вам прочитать главу по работе с IO и Потоками, Рихтера CLR via C# 4.0
WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 09:18
Оценка:
Вот такой пример запускаем 100 Task. для загрузки html. c одного сайта,
в синхронной версии программа работает в асинхронной не завершается?
Всегда остается 10-15 ждущих?
Почему?

Запускаем

  private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 100; i++)
            {

                Task.Factory.StartNew(
                    () =>
                        {
                          DoLongWork();
                        }

                    );
            }

        }



    private Object thisLock = new Object();

       void DoLongWork()
        {

            lock (thisLock)
            {
                count_start++;
            }

            var wc = new WebClient();

           

            //Вариант №1
            Variant1(wc);

            //Вариант №2
           // Variant2(wc);

        }


        void Variant1(WebClient wc)
        {
            wc.DownloadStringCompleted += (s, e) =>
            {
                lock (thisLock)
                {
                    count_end++;
                }

            };    

            wc.DownloadStringAsync(new Uri("http://www.yandex.ru")); 
        }

        void Variant2(WebClient wc)
        {
            try
            {
                wc.DownloadString(new Uri("http://www.yandex.ru"));
            }
            catch (WebException exp)
            { }

            lock (thisLock)
            {
                count_end++;
            }

        }


По таймеру просматриваем

private void timer1_Tick(object sender, EventArgs e)
        {
            Text = String.Format("Count Threads={0}, Count_Start={1},Count_end={2}",
                                 Process.GetCurrentProcess().Threads.Count,             
                                 count_start, count_end
                                 );              

        }



count_end — не доходит до 100 в асинхронной версии?
Какие могут быть причины?
1. Что-то не так в коде с lock!
2. У DownloadStringCompleted — нет таймаута по умолчанию?
3?

Спасибо за любой совет.
Re: WebClient не всегда работает?
От: Аноним  
Дата: 23.03.13 09:36
Оценка:
Здравствуйте, yniker, Вы писали:

Может быть экземпляр WebClient собирается сборщиком мусора? попробуй их куда-нибудь сохранять.
Re: WebClient не всегда работает?
От: vvlad.net  
Дата: 23.03.13 09:42
Оценка:
Здравствуйте, yniker, Вы писали:

Y> много чего...


Ну с локом норм, но лучше Interlocked.Increment заюзать.

1. Какую конкретно задачу ты пытаешься решить?
2. Почему WebClient объект один на все потоки?
3. Почему запуск асинхронного метода DownloadStringAsync делается также асинхронно?

Я могу прослыть банальным и любителем producer/consumer паттерна (в соседней ветке уже рекомендовал), но он тут тоже подходит...
Re[2]: WebClient не всегда работает?
От: vvlad.net  
Дата: 23.03.13 09:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, yniker, Вы писали:


А>Может быть экземпляр WebClient собирается сборщиком мусора? попробуй их куда-нибудь сохранять.


Кстати, это вполне возможно. Действительно, мы создаем WebClient, запускаем все асинхронно, и теряем на него ссылки.
А в соседней ветке я ошибся — думал там один на всех.
Re[2]: WebClient не всегда работает?
От: vvlad.net  
Дата: 23.03.13 09:46
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Здравствуйте, yniker, Вы писали:


VN>2. Почему WebClient объект один на все потоки?

Сорри, ошибся — см. http://rsdn.ru/forum/dotnet/5110157.1
Автор: vvlad.net
Дата: 23.03.13
Re[2]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 10:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, yniker, Вы писали:


А>Может быть экземпляр WebClient собирается сборщиком мусора? попробуй их куда-нибудь сохранять.



Переписал метод с Nlog. что-бы оптимизатор .NET не удалял обьект.

    private static readonly Logger Log = LogManager.GetCurrentClassLogger();

        void Variant1(WebClient wc)
        {
            wc.DownloadStringCompleted += (s, e) =>
            {

                if (e.Error != null)
                {
                    Log.Debug("Ошибка="+e.Error.Message);
                }
                else
                {
                    Log.Debug("Длина=" + e.Result.Length);
                }


                lock (thisLock)
                {
                    count_end++;
                }

            };    

            wc.DownloadStringAsync(new Uri("http://www.yandex.ru")); 
        }


Аналогично не работает.

1. Правильно ли я понимаю, что теперь никакой оптимизатор или сборщик памяти не удалит webclient я ведь от него жду результат.
2. Да кстати на другом ПК, первый вариант отлично работает. Но это меня совсем не устраивает у конечного пользователя может быть зоопарк антивирусов и firewall.
А все должно работать стабильно.
Re: WebClient не всегда работает?
От: _Raz_  
Дата: 23.03.13 10:52
Оценка:
Здравствуйте, yniker, Вы писали:

Y>Какие могут быть причины?

Y>3?

Может посмотреть в сторону ServicePointManager.DefaultConnectionLimit?
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 67>>
Re[2]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 10:53
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Здравствуйте, yniker, Вы писали:


Y>> много чего...


VN>Ну с локом норм, но лучше Interlocked.Increment заюзать.


VN>1. Какую конкретно задачу ты пытаешься решить?


Задача простая.

Есть миллионы Задач, задача состоит в следующем.
Скачать одну страницу, проанализировать результат, скачать еще одну страницу,
проанализировать результат, записать результат в базу.
С максимально возможной производительностью.
Варианты решения, синхронная версия.
1.
Решение в лоб, создаем 1000-2000 потоков, и спокойно синхронно, все это выполняем.
Минусы понятны, память, переключение между потоками.

2. ThreadPool — не даст нам одновременно 1000-2000 закачек сделать, или же создаст опять таки 1000-2000 реальных потоков. Со временем.

3. Task — тоже самое что и ThreadPool.
Варианты решения, асинхронная версия.
4. await я так понимаю будет тоже самое., хотя могу ошибаться.

Варианты решения, асинхронная версия.


VN>2. Почему WebClient объект один на все потоки?

VN>3. Почему запуск асинхронного метода DownloadStringAsync делается также асинхронно?
Вот тут начинаются проблемы.

Вот тут начинаются проблемы.

везде написано, что асинхронно крутто и.т.д. но на самом деле
DownloadStringAsync это же только НАПОЛОВИНУ асинхронная штука, не пойму зачем microsoft такую бяку сделали.
Ведь получение DNS и Proxy — там синхронно, да не много по времени 1-15 секун, но СИНХРОННО и в реальном приложении это уже большая проблема, вот которую я как раз и немогу пока как то правильно решить.

именно поэтому я в начале запускаю Task 100 штук, а там вызываю асинхронно webclient.
Хотя этот метод тоже не идеален, на время синхронизации мы получаем тормоза, да и 1000 задач не одновременно запустится, как бы хотелось, а постепенно.


VN>Я могу прослыть банальным и любителем producer/consumer паттерна (в соседней ветке уже рекомендовал), но он тут тоже подходит...

Тоже рассматриваю вариант, но пока не могу его применить логически для своей задачи. Не могу толком понять применимость.
Re[2]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 10:56
Оценка:
Здравствуйте, _Raz_, Вы писали:

_R_>Здравствуйте, yniker, Вы писали:


Y>>Какие могут быть причины?

Y>>3?

_R_>Может посмотреть в сторону ServicePointManager.DefaultConnectionLimit?


у меня стоит ServicePointManager.DefaultConnectionLimit = 1000;
Да и причем здесь это, в моем примере, проблема, не в том насколько БЫСТРО это отрабатывает, а в том что на моем ПК асинхронный метод вообще не завершается.
Re[3]: WebClient не всегда работает?
От: Аноним  
Дата: 23.03.13 12:02
Оценка:
Здравствуйте, yniker, Вы писали:

Y>1. Правильно ли я понимаю, что теперь никакой оптимизатор или сборщик памяти не удалит webclient я ведь от него жду результат.

Нет, попробуй экземпляр WebClient сохранить в какой-нибудь List перед DownloadStringAsync
Re[4]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 12:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, yniker, Вы писали:


Y>>1. Правильно ли я понимаю, что теперь никакой оптимизатор или сборщик памяти не удалит webclient я ведь от него жду результат.

А>Нет, попробуй экземпляр WebClient сохранить в какой-нибудь List перед DownloadStringAsync

побывал и через list, все аналогично.
Хотя подробней узнать было бы интересно почему, в предыдущей реализации может быть потеря ссылки.
Не исключено тогда, что и текущая с list не правильная реализация.
Как правильно тогда?

PS, большое спасибо всем за ответы.





   List<WebClient> List=new List<WebClient>();


      private void Form1_Load(object sender, EventArgs e)
        {
          ServicePointManager.DefaultConnectionLimit = 1000;
             
            for (int i = 0; i < 100; i++)
            {               
                List.Add(new WebClient());
            }

        }


        void DoLongWork()
        {
            int index = 0;

            lock (thisLock)
            {
                count_start++;
                index = count_start - 1;
            }

          

            //Вариант №1
            Variant1(List[index]);

            //Вариант №2
            //Variant2(List[index]);

        }
Re[5]: WebClient не всегда работает?
От: Аноним  
Дата: 23.03.13 12:25
Оценка:
Здравствуйте, yniker, Вы писали:

Y>побывал и через list, все аналогично.

Тогда сдаюсь

Y>Хотя подробней узнать было бы интересно почему, в предыдущей реализации может быть потеря ссылки.

С одной стороны раз есть подписанный ивент то потери ссылки быть не должно.
С другой — когда ты так подписываешься и наверняка подразумеваешь, что исходный объект будет собран когда не будет нужен.
Если разработчики фреймворка ориентировались на такой сценарий, то возможно события реализованы с помощью слабых ссылок, и тогда сборщик мусора может прибить объект если на него не осталось явных ссылок. Если нет, и в подписке честные ссылки, то будет утечка памяти без отписки.
Re[6]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 12:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, yniker, Вы писали:


Y>>побывал и через list, все аналогично.

А>Тогда сдаюсь

Y>>Хотя подробней узнать было бы интересно почему, в предыдущей реализации может быть потеря ссылки.

А>С одной стороны раз есть подписанный ивент то потери ссылки быть не должно.
А>С другой — когда ты так подписываешься и наверняка подразумеваешь, что исходный объект будет собран когда не будет нужен.
А>Если разработчики фреймворка ориентировались на такой сценарий, то возможно события реализованы с помощью слабых ссылок, и тогда сборщик мусора может прибить объект если на него не осталось явных ссылок. Если нет, и в подписке честные ссылки, то будет утечка памяти без отписки.

Событие, DownloadStringCompleted

Это единственный вариант получить ответ от DownloadStringAsync, не думаю что тут могут быть вообще слабые ссылки.
Задана работа и нужен результат, а его нет.

Может сам по себе WebClient жутко стабильная штука?
Re: WebClient не всегда работает?
От: Аноним  
Дата: 23.03.13 12:40
Оценка:
Здравствуйте, yniker, Вы писали:
Изменил Ваш код, добавив вывод сообщения об окончании загрузки. Прогон показал, что всё работает нормально. Отсюда вопрос: почему в асинхронной версии
Вы не обрабатываете исключения? Ведь они просто завершают поток и проглатываются, т.к. к результату Task не обращаетесь.
Re[3]: WebClient не всегда работает?
От: vvlad.net  
Дата: 23.03.13 12:41
Оценка:
Здравствуйте, yniker, Вы писали:

Y>Тоже рассматриваю вариант, но пока не могу его применить логически для своей задачи. Не могу толком понять применимость.


Уже понятно.

разбей твою задачу на подзадачи:
— вместо скачать-проанализировать-скачать-сохранить
— станет:

1. producer pushes download task to queue
2. consumer takes the task, downloads
3. consumer becomes producer — pushes downloaded result to queue
4. consumer (another one maybe) — takes the downloaded result, analyses it
5. consumer becomes producer — pushes download task (analyse result) to queue
6. consumer takes the task to download, pushes thre sult to queue
7. consumer takes the result, saves it to db

that's all.

Количество консумеров — количество потоков, не будет простоя.
В самих консумерах юзай пока синхронный вариант, тебе опыта не хватит заюзать асинхронный,
да и не особо это и критично для твоей задачи.
Re[2]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 12:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, yniker, Вы писали:

А>Изменил Ваш код, добавив вывод сообщения об окончании загрузки. Прогон показал, что всё работает нормально. Отсюда вопрос: почему в асинхронной версии
А>Вы не обрабатываете исключения? Ведь они просто завершают поток и проглатываются, т.к. к результату Task не обращаетесь.

Можно увидеть ваш код.
Я повторюсь на другом ПК у товарища тоже работает.



В таком варианте, тоже не работает

 void Variant1(WebClient wc)
        {
            wc.DownloadStringCompleted += (s, e) =>
            {

                if (e.Error != null)
                {
                    Log.Debug("Ошибка="+e.Error.Message);
                }
                else
                {
                    Log.Debug("Длина=" + e.Result.Length);
                }


                lock (thisLock)
                {
                    count_end++;
                }

            };

            try
            {
                wc.DownloadStringAsync(new Uri("http://www.yandex.ru"));
            }
            catch (Exception exp)
            {
                Log.Fatal("Ошибка=" + exp.Message);
            }

        }
Re[2]: WebClient не всегда работает?
От: Аноним  
Дата: 23.03.13 12:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ведь они просто завершают поток и проглатываются, т.к. к результату Task не обращаетесь.

Извиняюсь, похоже глупость сказал.
Re[7]: WebClient не всегда работает?
От: Аноним  
Дата: 23.03.13 12:58
Оценка:
Кстати, если проблема воспроизводится под отладчиком, то можно приостановить выполнение и посмотреть на активные потоки и их стэк трейсы.
По крайней мере понятно будет, завис ли клиент или потерялся результат.
Re[4]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 13:03
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Здравствуйте, yniker, Вы писали:


Y>>Тоже рассматриваю вариант, но пока не могу его применить логически для своей задачи. Не могу толком понять применимость.


VN>Уже понятно.


VN>разбей твою задачу на подзадачи:

VN>- вместо скачать-проанализировать-скачать-сохранить
VN>- станет:

VN>1. producer pushes download task to queue

VN>2. consumer takes the task, downloads
VN>3. consumer becomes producer — pushes downloaded result to queue
VN>4. consumer (another one maybe) — takes the downloaded result, analyses it
VN>5. consumer becomes producer — pushes download task (analyse result) to queue
VN>6. consumer takes the task to download, pushes thre sult to queue
VN>7. consumer takes the result, saves it to db

VN>that's all.


VN>Количество консумеров — количество потоков, не будет простоя.

VN>В самих консумерах юзай пока синхронный вариант, тебе опыта не хватит заюзать асинхронный,
VN>да и не особо это и критично для твоей задачи.

Спасибо буду анализировать ваш вариант, главное что-бы он еще логику работы не усложнил. Так что больше некуда.
На самом деле не просто закачка, а множественный анализа данных и много разных если.. задача больше похожа на черный ящик. с кучей подзадач.

Спасибо еще вопрос, если где стандартные красивые может, обертки producer-consumer, что-то вроде кода,
Re[5]: WebClient не всегда работает?
От: vvlad.net  
Дата: 23.03.13 13:12
Оценка:
Здравствуйте, yniker, Вы писали:

Y>Спасибо буду анализировать ваш вариант, главное что-бы он еще логику работы не усложнил. Так что больше некуда.

Y>На самом деле не просто закачка, а множественный анализа данных и много разных если.. задача больше похожа на черный ящик. с кучей подзадач.

Каждое длительное действие — задача (закачка, запись в базу данных...)
Во время анализа — если нужно закачать, а потом проверить результат —
займись пересмотром логики анализа, или просто — новые задачи: закачать, продолжить анализ.

Y>Спасибо еще вопрос, если где стандартные красивые может, обертки producer-consumer, что-то вроде кода,


Универсального нет, но набросок вот (нет шарпа)
http://en.wikipedia.org/wiki/Producer-consumer_problem
Re[8]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 15:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Кстати, если проблема воспроизводится под отладчиком, то можно приостановить выполнение и посмотреть на активные потоки и их стэк трейсы.

А>По крайней мере понятно будет, завис ли клиент или потерялся результат.

Да, действительно исключение есть. какое-то внутренное.

"Заданного параметра реестра не существует." думаю прокси идет проверка.

Но только что-то проверил на третей уже машине, все работает отлично работает с учетом и этого исключения.

Но проблема остается, на моей машине значит и у пользователей она будет
Re[8]: WebClient не всегда работает?
От: yniker  
Дата: 23.03.13 15:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Кстати, если проблема воспроизводится под отладчиком, то можно приостановить выполнение и посмотреть на активные потоки и их стэк трейсы.

А>По крайней мере понятно будет, завис ли клиент или потерялся результат.
Re[4]: WebClient не всегда работает?
От: yniker  
Дата: 24.03.13 11:59
Оценка:
Здравствуйте, vvlad.net, Вы писали:

VN>Здравствуйте, yniker, Вы писали:


Y>>Тоже рассматриваю вариант, но пока не могу его применить логически для своей задачи. Не могу толком понять применимость.


VN>Уже понятно.


VN>разбей твою задачу на подзадачи:

VN>- вместо скачать-проанализировать-скачать-сохранить
VN>- станет:

VN>1. producer pushes download task to queue

VN>2. consumer takes the task, downloads
VN>3. consumer becomes producer — pushes downloaded result to queue
VN>4. consumer (another one maybe) — takes the downloaded result, analyses it
VN>5. consumer becomes producer — pushes download task (analyse result) to queue
VN>6. consumer takes the task to download, pushes thre sult to queue
VN>7. consumer takes the result, saves it to db

VN>that's all.


VN>Количество консумеров — количество потоков, не будет простоя.

VN>В самих консумерах юзай пока синхронный вариант, тебе опыта не хватит заюзать асинхронный,
VN>да и не особо это и критично для твоей задачи.

Проанализировав ваш ответ (патерн), это не правильное решение.
Что даст этот патерн.
Создаем 1 поток. который подает данные.
Создаем 1000 потоков которые читают данные с первого потока и делают загрузку, анализ.
И совсем не критично, ну подумаешь 1гиг памяти для потоков выделится просто так, процессор будет нагружен переключением потоков, и самой интересное что 99% вообще эти потоки ничего делать не будут, а просто синхронно ждать.
А Microsoft путь и дальше придумывает свои Task, ThreadPool, await и асинхронные операции. Мы будем плодить потоки.
Re[6]: WebClient не всегда работает?
От: yniker  
Дата: 24.03.13 13:13
Оценка:
VN>Мда, парниша. А как ты хочешь делать одновременные загрузки и анализ? в одном потоке???

VN>Почитай про многопоточность и IO. Особенно про последнее. Я тебе в письме отписывал — пока работает IO операция, спит поток, который ее вызвал, зато активируется другой, который в этот момент делает анализ чего-либо. Если тебе стремно создавать 1000 потоков (по метру памяти на каждый), то тогда тебе надо поискать форумы по эрлангу.

VN>Я, в принципе, мог бы сделать вариант, когда потоки не ждут (запустили IO, ушли делать другие дела), это сэкономит нам количество потоков (но время выполнения останется практически тем-же). Да и то, что я прислал — уже для такого подходит.

Не получил от Вас письма, буду благодарен если еще раз перешлете, (в спаме тоже нет.)
Спасибо. y n i k e r @ g m a i l . c o m
Re[7]: WebClient не всегда работает?
От: vvlad.net  
Дата: 24.03.13 13:18
Оценка:
Здравствуйте, yniker, Вы писали:


VN>>Мда, парниша. А как ты хочешь делать одновременные загрузки и анализ? в одном потоке???


VN>>Почитай про многопоточность и IO. Особенно про последнее. Я тебе в письме отписывал — пока работает IO операция, спит поток, который ее вызвал, зато активируется другой, который в этот момент делает анализ чего-либо. Если тебе стремно создавать 1000 потоков (по метру памяти на каждый), то тогда тебе надо поискать форумы по эрлангу.

VN>>Я, в принципе, мог бы сделать вариант, когда потоки не ждут (запустили IO, ушли делать другие дела), это сэкономит нам количество потоков (но время выполнения останется практически тем-же). Да и то, что я прислал — уже для такого подходит.

Y>Не получил от Вас письма, буду благодарен если еще раз перешлете, (в спаме тоже нет.)

Y>Спасибо. y n i k e r @ g m a i l . c o m

Ок, перешлю.
Re[9]: WebClient не всегда работает?
От: vvlad.net  
Дата: 24.03.13 20:13
Оценка:
Здравствуйте, yniker, Вы писали:

Y>У меня есть сервер на 10000 клиентов, с 32 ОС. Всем надо работать "паралельно, одновременно".

Y>1. ОС не даст создать 10000 потоков.
Y>2. Работать не будет? БУДЕТ! и всего в нескольких потоках.
Y>Да и поможет здесь не форумы по по эрлангу, а асинхронная работа.
Y>Чудеса? Нет.
Y>Советую вам прочитать главу по работе с IO и Потоками, Рихтера CLR via C# 4.0

Ну а я что говорил? разве я предлагал по нескольку потоков на клиента?
Ты же как партизан молчишь, подробностей не даешь совсем.

А что такое асинхронная работа, ты сам знаешь? а что с P-C это и можно организовать (количество и типы консумеров — на усмотрение разработчика).

Все равно, задача для каждого клиента не будет длиться меньше, чем время всех (логически) последовательных закачек и анализа, нужных конкретному клиенту. Тут чудес не бывает, читай закон Амдала.

Если у тебя 10000 клиентов, то парадигма клиент-поток уже давно не работает, так как ты думаешь, что используют в этих случаях?
Re[10]: WebClient не всегда работает?
От: yniker  
Дата: 25.03.13 07:24
Оценка:
Спасибо всем за ответы, удалось решить проблему почему DownloadStringCompleted
не вызывается, все очень просто, нет timeout для асинхронных операций, их должен писать разработчик. Поэтому весит вечно, думают тут благодаря антивирусу или firewall на моем ПК ибо на других все отлично.


VN>Все равно, задача для каждого клиента не будет длиться меньше, чем время всех (логически) последовательных закачек и анализа, нужных конкретному клиенту. Тут чудес не бывает, читай закон Амдала.


Амдала для вычислительных опрераций, IO операции не совсем то.


VN>задача для каждого клиента не будет длиться меньше, чем время всех (логически) последовательных закачек и анализа, нужных конкретному клиенту

Это естественно.


VN>Если у тебя 10000 клиентов, то парадигма клиент-поток уже давно не работает, так как ты думаешь, что используют в этих случаях?


P-C + асинхронность, только P- равное "примерно" кол-во процессоров в системе?
Re[11]: WebClient не всегда работает?
От: vvlad.net  
Дата: 25.03.13 10:02
Оценка:
Здравствуйте, yniker, Вы писали:

Y>Спасибо всем за ответы, удалось решить проблему почему DownloadStringCompleted

Y>не вызывается, все очень просто, нет timeout для асинхронных операций, их должен писать разработчик. Поэтому весит вечно, думают тут благодаря антивирусу или firewall на моем ПК ибо на других все отлично.


VN>>Все равно, задача для каждого клиента не будет длиться меньше, чем время всех (логически) последовательных закачек и анализа, нужных конкретному клиенту. Тут чудес не бывает, читай закон Амдала.


Y>Амдала для вычислительных опрераций, IO операции не совсем то.


Ага, но и они не позволят тебе базироваться на результатах IO прежде, чем это IO не закончится. Ну нет такой машины времени...
Кроме того, пусть это просто сброс данных на диск, но если это единственная seq операция, то время сброса данных (результатов) будет учитываться...

VN>>задача для каждого клиента не будет длиться меньше, чем время всех (логически) последовательных закачек и анализа, нужных конкретному клиенту

Y>Это естественно.


VN>>Если у тебя 10000 клиентов, то парадигма клиент-поток уже давно не работает, так как ты думаешь, что используют в этих случаях?


Y>P-C + асинхронность, только P- равное "примерно" кол-во процессоров в системе?

Не P- а -C. Продюсеры — это не потоки! Это сущности, каждый консумер может выступить в роли продюсера, запихнув в очередь порцию данных для другого консумера. Вот они уже являются активной единицей, в отличии от продюсеров, в качестве которых может выступать кто угодно.

По сути расчитывать можно так:
-> количество ядер = количество консумеров, которые занимаются анализом
+ количество ядер * 10 (или 5) = количество консумеров, которые занимаются IO

Балансировать можно по принципу уменьшения количесва консумеров, пока их в очереди (ждут задачу) больше одного.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.