powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / параллельные запросы HttpWebRequest
25 сообщений из 67, страница 2 из 3
параллельные запросы HttpWebRequest
    #40025578
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

я имел в виду не обработку полученного с сервера ответа HandleRequestResult(result), а само считывание reader.ReadToEndAsync(). хотя оно, по идее, тоже асинхронное, да, я туплю... тогда всё упирается чисто в мой 4 ядерный проц, надо брать новый. тогда остался загадкой только выбор количества соединений ServicePointManager.DefaultConnectionLimit = 9, который зависит хз от чего и должен быть хз каким
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025579
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
reader.ReadToEndAsync().
если у тебя там миллион строк, то вряд ли стоит применять ReadToEnd
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025581
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
qlewerok
reader.ReadToEndAsync().
если у тебя там миллион строк, то вряд ли стоит применять ReadToEnd
можно для эксперимента использовать опцию LongRunning, чтобы поток брался не из пула, посмотреть, что изменится
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025584
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
нужно 100 потоков, по потоку на соединение, в каждом происходит обращение, получение ответа, обработка. если так нельзя\не принято, то почему?

Ну, потому что прочитай, например, в книге Рихтера "CLR via C#" как работает асинхронный I/O и поймешь, почему его не надо делать в отдельном потоке.

Вкратце - когда ты вызываешь операцию I/O асинхронно, то она происходит моментально и приложение просто продолжает работать дальше. Когда же вызванная операция (чтение, запись, запрос по web, и т.п.) действительно выполнена OS, то рантайн сам вызывает callback, который ты ему передал при вызове этой операции. Код с async/await это просто удобная обертка поверх этого, чтобы руками не писать и никуда не передавать миллионы этих callback-ов.

А если ты вместо этого создашь руками (или возьмешь из пула) поток и вызовешь в нем I/O синхронно, то тогда у тебя весь этот поток на все время I/O будет заблокирован. А поток это довольно-таки дорогостоящий и ограниченный ресурс OS, и если у тебя таких заблокированных, хоть и на время, потоков будет много, то будет плохо. Я сам еще давно лично наблюдал, как у нас виндовый сервер впадал в кому, когда какой-то индусский код безо всякого ума вручную создавал чуть больше всего лишь 900 потоков. Для этого ThreadPool и придумали - во-первых, чтобы не создавать всякий раз потоки с нуля руками (т.к. это дорого), а во-вторых (что в нашем этом случае важнее) чтобы не дать приложению создавать слишком много потоков.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025642
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всё-таки бутылочное горлышко кроется в
Код: vbnet
1.
ServicePointManager.DefaultConnectionLimit = 9

при 9 вроде работает, при 10 начинает сыпаться часть соединений, количество падающих соединений увеличивается при увеличении максимального числа соединений
Код: vbnet
1.
Вызвано исключение: "System.Net.WebException" в mscorlib.dll

в интернете люди как-то выставляют его в сотни. у меня проц i5 3570k с 4 ядрами, если это как-то поможет...

Shocker.Pro,
во всём интернете ни одного примера на vb.net, как правильно в впихнуть LongRunning. похоже, было собрание программистов, где решили забросить vb.net, на которое меня не позвали...
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025647
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
похоже, было собрание программистов, где решили забросить vb.net
я искренне советую переходить на C# пока не поздно. По VB.NET и 10 лет назад было 5% материала против 95% на C#, а сейчас его количество стремится к нулю. По NET5 его не будет вообще.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025648
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
при 10 начинает сыпаться часть соединений
с какой ошибкой?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025683
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProПо NET5 его не будет вообщеу меня есть вы)
Shocker.Proс какой ошибкой?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025684
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
у меня есть вы)
на форуме нет ни одного спеца по VB.NET (из постоянных)

По ошибке - ну и причем тут твой код? Это тебя либо удаленный сервер отшивает, либо твоя промежуточная инфраструктура
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025689
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
удаленный сервер отшивает
тебе ботнет нужен. Неудивительно, что удаленный сервер обрывает соединения с одного IP. Скажи спасибо, что не банит за DoS
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025690
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok,

Скорее всего, сервер распознаёт твой перформанс, как DOS-атаку.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025691
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
перформанс
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025697
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatСкорее всего, сервертогда миссия меняется) как все вот эти параллельные обращения к серверу выполнять с заданным в миллисекундах интервалом?) чтобы не ддосить и при этом не останавливать всю программу... запускать таймер и проверять его или что-то сложнее?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025705
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
как все вот эти параллельные обращения к серверу выполнять с заданным в миллисекундах интервалом

Да я же тебе всю дорогу объясняю, что тебе не нужны паралельные обращения. При асинхронных вызовах они и так будут "параллельные" - каждый запрос будет отправляться сразу же, а не ждать, когда закончится предыдущий. В пределах установленных лимитов на одновременное число соединений, конечно - но тут ты уже ничего сделать не сможешь, т.к., сам сервер, как ты видишь, при слишком большом числе коннектов тебя отошьет.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025721
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
тогда миссия меняется) как все вот эти параллельные обращения к серверу выполнять с заданным в миллисекундах интервалом?) чтобы не ддосить и при этом не останавливать всю программу... запускать таймер и проверять его или что-то сложнее?
Поскольку сервер тебя посылает при больше 9 одновременных подключений, тебе достаточно работать очередью в 9 запросов и никакой таймер тебе не нужен. А если он тебя забанит за DoS, тут никакие миллисекунды не помогут
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025732
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok,

Вот тебе еще пример:


Код: 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.
26.
27.
28.
29.
30.
31.
ServicePointManager.ServerCertificateValidationCallback = (_, _, _, _) => true;

Stopwatch sw = new();

// тут параллелим на 100 потоков
sw.Reset();
sw.Start();
await Task.WhenAll(Enumerable.Repeat(0, 100).Select(__ =>
    Task.Run(() => {
        // в каждом потоке 1 синхронный запрос
        var request = HttpWebRequest.Create("https://sql.ru");
        using var response = request.GetResponse();
        using var stream = response.GetResponseStream();
        using StreamReader reader = new StreamReader(stream);
        _ = reader.ReadToEnd();
    })));
sw.Stop();
Console.WriteLine($"Сто потоков: {sw.ElapsedMilliseconds}");

// тут все просто асинхронно
sw.Reset();
sw.Start();
await Task.WhenAll(Enumerable.Repeat(0, 100).Select(async __ => {
    var request = HttpWebRequest.Create("https://sql.ru");
    using var response = await request.GetResponseAsync();
    using var stream = response.GetResponseStream();
    using StreamReader reader = new StreamReader(stream);
    _ = await reader.ReadToEndAsync();
}));
sw.Stop();
Console.WriteLine($"Сто запросов асинхронно: {sw.ElapsedMilliseconds}");


ВыхлопСто потоков: 6467
Сто запросов: асинхронно: 1517


Как видишь, без всякого распараллеливания получилось быстрее более чем в 4 раза.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025744
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
Как видишь, без всякого распараллеливания получилось быстрее более чем в 4 раза.

Кстати, попробовал этот код еще меняя DefaultConnectionLimit (от 2 до 10), и по времени выполнения изменений вообще никаких - ни в абсолютных значениях, ни в относительных.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025762
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok,
всё смешалось, многопоточность, параллельность
про асинхронные операции даже не слышал небось, да ?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025764
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

хотел посмореть, что за сишарп ваш такой заморский, но приведенный код в консоли не выводит ничего. так работает:
Код: c#
1.
await Task.WhenAll(Enumerable.Repeat(0, 0).Select(__ =>

а так уже игнорит:
Код: c#
1.
await Task.WhenAll(Enumerable.Repeat(0, 1).Select(__ =>

fkthatменяя DefaultConnectionLimit (от 2 до 10), по времени выполнения изменений вообще никакихспециально перепроверил. у меня с изменением соединений с 2 до 9 время выполнения уменьшается примерно в 3 раза
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025766
Сотрудник Главного Управления
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
хотел посмореть, что за сишарп ваш такой заморский

это не си шарп заморский, это твой бейсик мазохический с ужасным синтаксисом

прекрати заниматься мазохизмом,
переходи на гораздо более красивый, понятный, логичный и лаконичный си шарп
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025770
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
хотел посмореть, что за сишарп ваш такой заморский, но приведенный код в консоли не выводит ничего

У тебя какая версия дотнета и VS?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025772
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,
пытался засунуть картинку в спойлер, но не судьба
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025775
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok,

А как ты сам код на C# пробовал-то?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025778
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

создал проект, выбрал язык C# для windows
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

namespace forumsql
{
    class Program
    {
        static void Main(string[] args)
        {
            AA();
            Console.WriteLine("Hello World!");
        }
        static async void AA()
        {  
            System.Net.ServicePointManager.ServerCertificateValidationCallback = (_, _, _, _) => true;
            Stopwatch sw = new();
            // тут параллелим на 100 потоков
            sw.Reset();
            sw.Start();
            await Task.WhenAll(Enumerable.Repeat(0, 1).Select(__ =>
                Task.Run(() =>
                {
                    // в каждом потоке 1 синхронный запрос
                    var request = HttpWebRequest.Create("https://sql.ru");
                    using var response = request.GetResponse();
                    using var stream = response.GetResponseStream();
                    using StreamReader reader = new StreamReader(stream);
                    _ = reader.ReadToEnd();
                })));
            sw.Stop();
            Console.WriteLine($"Сто потоков: {sw.ElapsedMilliseconds}");
        }
    }
}

...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025779
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя этот код немедленно скажет Hello World! и завершит работу
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / параллельные запросы HttpWebRequest
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]