Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многопоточное скачивание файлов с интернет 
V
    Опции темы
Dims
Дата 29.12.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 2
Всего: 11



Сделал многопоточный граббер. Каждый поток оформил в виде динамически создающегося BackgroundWorker-а. То есть, в программе создаётся множество таких объектов. У каждого потока сделал свой HttpWebRequest и HttpWebResponse.

Но почему-то многопоточность не даёт никакого толку. То есть, замеряемая скорость скачивания не увеличивается с увеличением числа потоков (и даже немного уменьшается).

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

Что это за ресурс? Как его найти?
PM MAIL   Вверх
Partizan
Дата 29.12.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



Dims, а с чего вдруг многопоточность должна давать прирост в скорости скачки? ) вроде как ширина интернет-канала остаётся неизменной при любом количестве потоков  smile 


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Dims
Дата 29.12.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 2
Всего: 11



Есть такие широко известные программы, как Reget или Teleport и их аналоги. Все они используют многопоточность и дают значительный прирост в скорости скачивания засчёт неё. Я не знаю точно, почему это происходит.

Скажем так, если мой граббер запустить несколько раз, то есть, чтобы было, скажем, 20 приложений по 1 потоку в каждом, то скачивание происходит быстрее, чем если запустить одно приложение с 20 потоками.

Почему? Где узкое место?
PM MAIL   Вверх
Partizan
Дата 29.12.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



Dims, а что...отследить последовательность выполнения потоков никак?

Цитата

Почему? Где узкое место? 


з.ы. При отсутствии исходников, а также прокаченных навыков телепатии, на такой вопрос ответить, мягко говоря, сложновато


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Dims
Дата 30.12.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 2
Всего: 11



Цитата(Partizan @  29.12.2008,  23:01 Найти цитируемый пост)
Dims, а что...отследить последовательность выполнения потоков никак?

А какими средствами это делается?
PM MAIL   Вверх
Partizan
Дата 30.12.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 67



Dims, например можно выводить в окно Output через Debug.Write время, когда поток стартует.


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Dims
Дата 1.1.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 2
Всего: 11



Вот таким кодом я запускаю грабберы:

Код

private void StartGrabbers(int size)
        {
            BackgroundWorker cGrabber;
            cGrabbersList.Items.Clear();
            grabbers.Clear();
            for (int i = 0; i < size; ++i)
            {
                cGrabbersList.Items.Add(i.ToString());
                cGrabbersList.Items[cGrabbersList.Items.Count - 1].SubItems.Add("Initialising");
                cGrabbersList.Items[cGrabbersList.Items.Count - 1].SubItems.Add("");
                cGrabber = new System.ComponentModel.BackgroundWorker();
                cGrabber.WorkerSupportsCancellation = true;
                cGrabber.DoWork += new System.ComponentModel.DoWorkEventHandler(this.cGrabber_DoWork);
                cGrabber.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.cGrabber_RunWorkerCompleted);
                grabbers.Add(cGrabber, i);
                GrabbersActual++;
                cGrabber.RunWorkerAsync();
            }
        }


По какой-то причине сообщения об их запуске приходят последовательно, примерно раз в секунду. Почему? Казалось бы, все грабберы должны начинать работать параллельно и почти одновременно?
PM MAIL   Вверх
Dims
Дата 21.1.2009, 04:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 2
Всего: 11



Я нашёл причину того, что мои треды работали медленнее. Действительно, существует разделяемый ресурс -- максимальное количество соединений. Его можно настраивать в конфигурационном XML файле программы. Моё множество тредов пользовалось ограниченным небольшим количеством соединений, в результате, большую часть времени треды ждали, пока освободится соединение. Это и приводило к задержке.
PM MAIL   Вверх
andrey_pro
Дата 22.1.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



а можно поподробнее

что за конфигурационный файл XML, где он, что именно настраивать?
PM MAIL   Вверх
Dims
Дата 22.1.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 2
Всего: 11



Есть такая штука "Application Configuration file"

Чтобы её добавить в проект, видимо, надо сделать Project | Add New Item | Application Configuration file

Это будет XML файл, который можно редактировать в обычном текстовом редакторе.

XML файл состоит из вложенных друг в друга гнёзд, ограниченных тегами, примерно, как HTML.

По умолчанию, в новом файле создаётся гнездо 

Код

<configuration>
</configuration>


я в это гнездо, помимо тех элементов, которые там у меня уже были, добавил ещё и 

Код

<system.net>
    <connectionManagement>
      <add address="*"   maxconnection="1000"   />
    </connectionManagement>
</system.net>


этот элемент управляет свойствами библиотеки System.Net, а подэлемент connectionManagement управляет пулом соединений, который, видимо, библиотека поддерживает для программы. В данном случае я говорю, что для всех сайтов разрешить максимально 1000 соединений.

В моём случае этот файл должен был находиться в той же папке, что и EXE-шник. Наверное, для ASP и других случаев могут быть другие варианты.

Я нашёл на каком-то англоязычном форуме указание на ситуацию, аналогичную моей. Там была ссылка про это. И я почитал хелп, там целая куча всяких таких настроек. Не знаю, можно ли то же самое сделать из кода программы при выполнении.

Добавлено через 5 минут и 3 секунды
P.S. Скорость работы совершенно чётко возросла примерно в 10 раз, по объективным измерениям. От этого у меня даже часть, которая подаёт данные, стала работать гораздо быстрее треда, который их кушает (кладёт в базу данных), что привело к проявлению других багов, которые я первоначально не учёл.
PM MAIL   Вверх
andrey_pro
Дата 22.1.2009, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 21.9.2007

Репутация: нет
Всего: нет



спасибо

очень информативно
PM MAIL   Вверх
Dims
Дата 22.1.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 2
Всего: 11



Тады залепите мне плюс smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.