Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 12
1

Многопоточный парсер

23.02.2016, 16:41. Показов 2950. Ответов 11
Метки нет (Все метки)

Пытаюсь создать многопоточный парсер, но появилась проблема.
Пытался сделать через Thread + делегат и через task, но при использовании:
C#
1
2
3
4
5
6
for (int i = 0; i < u2; i++)
{
  Task t = Task.Run( () => { ghj[i] = Pa(z1, ewqe * 1000, "1000"); });
  t.Start();
}
t.Wait();
в массив ghj не записывается значения, если я не жду завешения в цикле.
Подскажите, как можно реализовать многопоточный парсер или что подправить в этом коде?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2016, 16:41
Ответы с готовыми решениями:

Многопоточный парсер сайтов: как обрабатывать javaScript
Здравствуйте! Есть задание написать парсер 3-х сайтов с извлечением определенной информации (для...

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

Многопоточный TCP сервер
Доброго времени суток! Я уже долгое время пытаюсь написать сервер, который может принимать много...

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

11
Неадекват
1445 / 1194 / 234
Регистрация: 02.04.2010
Сообщений: 2,730
23.02.2016, 16:57 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Linq;
using System.Threading.Tasks;
 
namespace ConsoleApplication27
{
    class Program
    {
        static void Main(string[] args)
        {
            var ARRAY_SIZE = 10;
 
            var rnd = new Random();
            var array = new int[ARRAY_SIZE];
 
            Parallel.ForEach(Enumerable.Range(0, ARRAY_SIZE), index =>
            {
                array[index] = rnd.Next(0, 10);
            });
 
            Console.WriteLine(string.Join(", ", array));
            Console.ReadKey();
        }
    }
}
1
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 12
23.02.2016, 17:46  [ТС] 3
C#
1
2
3
4
Parallel.ForEach(Enumerable.Range(0, u2), index =>
{
  Task t1 = Task.Run(() => { ghj[index] = Pa(z1, index * 1000, "1000"); });
});
Я тебя правильно понял?
0
Неадекват
1445 / 1194 / 234
Регистрация: 02.04.2010
Сообщений: 2,730
23.02.2016, 17:51 4
Task.Run не нужен. Тело лямбды уже в многопотоке )))
C#
1
2
3
4
Parallel.ForEach(Enumerable.Range(0, u2), index =>
{
  ghj[index] = Pa(z1, index * 1000, "1000");
});
1
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 12
23.02.2016, 17:57  [ТС] 5
Спасибо. Можешь написать ссылку на msdn? Я так понял, что создает новый поток для каждого действия. Как можно ограничить кол-во потоков? раньше я думал так: проверка кратности номера текущего потока на кол-во разрешенных потоков или не является ли этот поток последним, если да, то ждать завершения последнего потока.
0
Неадекват
1445 / 1194 / 234
Регистрация: 02.04.2010
Сообщений: 2,730
23.02.2016, 18:03 6
MSDN
Цитата Сообщение от Noth Посмотреть сообщение
Я так понял, что создает новый поток для каждого действия? Как можно ограничить кол-во потоков?
Нет, потоки берутся из пула потоков. Ограничить количество можно методом ThreadPool.SetMaxThreads - в некоторых пределах.
1
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 12
27.02.2016, 16:06  [ТС] 7
freeba.
Появилась проблема =)
т.к. обработать нужно 10к страниц, при многопоточности появляется ошибка:
{"Удаленный хост принудительно разорвал существующее подключение"}
с чего я подумал, что это из-за многопоточности? если ограничивать через ThreadPool.SetMaxThreads, то чем меньше значения я ставлю, тем меньше страниц обрабатываются перед возникновении этой ошибки.
парсю таким кодом:
C++
1
2
3
4
5
6
7
            WebRequest req = WebRequest.Create(Url + "?" + Data);
            WebResponse resp = req.GetResponse();
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string Out = sr.ReadToEnd();
            sr.Close();
            return Out;
0
Неадекват
1445 / 1194 / 234
Регистрация: 02.04.2010
Сообщений: 2,730
27.02.2016, 16:29 8
Request и Response тоже нужно Close
0
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 12
27.02.2016, 16:45  [ТС] 9
freeba, у request нет close, но есть abort. Но все равно не помогло. т.е. я WebRequest Abort'нул, WebResponse, Stream и StreamReader Close
0
Неадекват
1445 / 1194 / 234
Регистрация: 02.04.2010
Сообщений: 2,730
27.02.2016, 16:47 10
Значит хост не хочет чтобы его парсили и рубит ip
0
0 / 0 / 0
Регистрация: 23.02.2016
Сообщений: 12
27.02.2016, 16:55  [ТС] 11
freeba, nope, запустил 15 раз прогу, запустил парс 100 страниц на каждой, все работают без ошибок. если запускать из проги парс 1.5к страниц, то на половине выбивает ошибку
0
Неадекват
1445 / 1194 / 234
Регистрация: 02.04.2010
Сообщений: 2,730
27.02.2016, 17:00 12
Парсинг это такое дело. Оберните место с ошибкой в try{}catch{} И посмотрите - если перестанет парсить после определенного значения - значит хост врубает антиддос. Если пропускает единичные страницы, то просто в catch - выводите зафейленные страницы и смотрите что с ними не так.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2016, 17:00

Многопоточный геттер System.IndexOutOfRangeException
Есть такой код, так вот не могу понять почему в переменную next, которая используется как счетчик...

Многопоточный сервер: доступ клиентов к данным
Здравствуйте нашёл в интернете многопоточный сервер using System; using...

Можно ли создать безопасный многопоточный класс
Всем еще раз привет. Пишу класс, который общается с USB- устройством. У него есть методы,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.