powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / параллельные запросы HttpWebRequest
67 сообщений из 67, показаны все 3 страниц
параллельные запросы HttpWebRequest
    #40025094
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в цикле в пуле потоков
Код: vbnet
1.
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf NwBra), id)

запускаю каждое обращение к сайту в отдельном потоке
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Sub NwBra(ByVal id As Object)
Dim fr As HttpWebRequest = DirectCast(HttpWebRequest.Create("https://www.site"), System.Net.HttpWebRequest)
        fr.ContentType = "application/x-www-form-urlencoded"
        fr.Method = "GET"
        Dim responseString As String = ""
        fr.GetResponse()
        Dim str As New System.IO.StreamReader(fr.GetResponse().GetResponseStream())
        responseString = str.ReadToEnd()
        str.Close()
End Sub

но всё равно запросы выполняются последовательно( подскажите, как заставить их обращаться параллельно, для 100 запросов время доходит до 20 секунд, что критично
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025101
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему ты просто не используешь GetResponseAsync?
К чему вся эта свистопляска с многопоточностью?
На шарпе можно примерно так (на VB уже сам переводи, если что):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
const int ParallelCount = 100;
const string Url = "http://foo.bar.io";

var results = await Task.WhenAll(
    Enumerable.Repeat(0, ParallelCount).Select(async _ => {
        var webRequest = HttpWebRequest.Create(Url);
        using var response = await webRequest.GetResponseAsync();
        using var stream = response.GetResponseStream();
        using StreamReader reader = new(stream);
        return await reader.ReadToEndAsync();
    }));

foreach (var r in results)
{
    Console.WriteLine(r);
}
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025104
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

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

я тупой и не могу прочесть( какие-то юсинги, енумераблы. сейчас сделал последовательную отправку запросов, повесил асинхронную обработку ответов, выполняется так же последовательно почему-то
Код: vbnet
1.
Dim result As IAsyncResult = CType(request.BeginGetResponse(AddressOf otpravkaonline3, request), IAsyncResult)
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025113
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

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

На бейсике у меня вышло как-то так (я на нем ни разу в жизни не писал, т.ч. не знаю насколько это кошерно ):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Async Function Main(args As String()) As Task
    Dim count = 100
    Dim url = "foo.bar.baz"

    Dim results = Await Task.WhenAll(
        Enumerable.Repeat(0, 100).Select(
            Async Function(i As Int32)
                Dim webRequest = HttpWebRequest.Create(url)
                Using response = Await webRequest.GetResponseAsync()
                    Using stream = response.GetResponseStream()
                        Using reader = New StreamReader(stream)
                            Return Await reader.ReadToEndAsync()
                        End Using
                    End Using
                End Using
            End Function))

    For Each r In results
        Console.WriteLine(r)
    Next
End Function


А что, даже прикольно. Может мне на VB.NET мигрировать

По-хорошему надо конечно еще try-catch расставить, чтобы один упавший запрос не факапил все 99 остальных, но это уже ньюансы.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025116
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
fkthat,

есть такой код на vb.net?) пожалуйста
https://converter.telerik.com
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025117
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Сейчас попробовал. Он, похоже, даже C# 8 не понимает.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025118
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну значит ТС пусть на шарп переходит.
Я абсолютно не понимаю, как кто-то может писать на VB.NET при практически полном отсутствии статей, учебников и документации.
Даже Microsoft перестал включать в современную документацию примеры на VB.NET.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025119
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Даже Microsoft перестал включать в современную документацию примеры на VB.NET.

https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/ Going forward, we do not plan to evolve Visual Basic as a language . This supports language stability and maintains compatibility between the .NET Core and .NET Framework versions of Visual Basic. Future features of .NET Core that require language changes may not be supported in Visual Basic .

Так что я с миграцией на него все же поторопился :))
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025154
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала проверь, стоит ли вообще все в многопоток делать- может последовательно и быстрее получится конкретно в твоем случае.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025156
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
Сначала проверь, стоит ли вообще все в многопоток делать- может последовательно и быстрее получится конкретно в твоем случае.

Да на кой проверять. Многопоточность для I/O не нужна вообще никогда. Для него существуют неблокирующие async-вызовы.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025227
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

я честно пытался использовать код, и так и эдак его впихивал, но никак( синтаксис сложный для понимания или я тупой. в итоге вернулся к пулу потоков. так же в цикле отправляю в пул функцию без всяких асинхронностей (обращение и функция в самом посте). вывел в консоль номера потоков и обнаружил, что на 70 соединений у меня 3-4 потока. т.е. несмотря на умные статьи, где расхваливают автоматический подбор необходимого количества потоков, это чушь. задаю количество потоков и получаю прирост в несколько раз
Код: vbnet
1.
ThreadPool.SetMinThreads(20, 20)

далее увеличиваю количество одновременных соединений http и получаю прирост по скорости еще в несколько раз
Код: vbnet
1.
ServicePointManager.DefaultConnectionLimit = 50

. но всё равно код выполняется больше секунды для 70 соединений, это долго. что-то явно можно улучшить, буду благодарен, если подскажете, что. и цифры 20 и 50 я брал методом тыка. если увеличивать, начинают сыпаться ошибки соединения, какие цифры должны быть и от чего зависит, я хз(
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025232
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
вернулся к пулу потоков.

qlewerok
Код: vbnet
1.
ThreadPool.SetMinThreads(20, 20)


Ну что поделать, тут или разбираться, как это надо делать (т.е. без ThreadPool и прочего легаси), либо потом отгребать последствия:
https://docs.microsoft.com/en-us/dotnet/api/system.threading.threadpool.setminthreads?view=net-5.0#remarks Caution

By default, the minimum number of threads is set to the number of processors on a system. You can use the SetMinThreads method to increase the minimum number of threads. However, unnecessarily increasing these values can cause performance problems . If too many tasks start at the same time, all of them might appear to be slow. In most cases, the thread pool will perform better with its own algorithm for allocating threads. Reducing the minimum to less than the number of processors can also hurt performance .
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025258
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

ваш код выполняется 6 секунд. если увеличить количество макс соединений до 9, выполняется за 1.5 секунд, как и мой. если 10 соединений, то начинает сыпаться подключение, от чего зависит, опять же, не знаю
Код: vbnet
1.
ServicePointManager.DefaultConnectionLimit = 9

хочу использовать ваш код, но в нём выносит мозг строка
Код: vbnet
1.
Enumerable.Repeat(0, 100).Select(

все три слова впервые встречаю в языке. подскажете, как будет выглядеть код без неё? можно с разложением на несколько функций, а то там одна в другой как-то... и url у меня разные, передаются как раз в args As String()
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025270
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
fkthat,

ваш код выполняется 6 секунд. если увеличить количество макс соединений до 9, выполняется за 1.5 секунд, как и мой. если 10 соединений, то начинает сыпаться подключение, от чего зависит, опять же, не знаю
Код: vbnet
1.
ServicePointManager.DefaultConnectionLimit = 9


хочу использовать ваш код, но в нём выносит мозг строка
Код: vbnet
1.
Enumerable.Repeat(0, 100).Select(


все три слова впервые встречаю в языке. подскажете, как будет выглядеть код без неё? можно с разложением на несколько функций, а то там одна в другой как-то... и url у меня разные, передаются как раз в args As String()


Enumerable.Repeat(0, 100) это библиотечный класс/метод который генерирует последовательность из 100 нулей. Select(...) берет поочередно каждый элемент этой последовательности (в данном случае это просто 0, но нам он не нужен, важно что их будет 100) и вызывает для этого элемента переданную в этот метод функцию, а затем возвращает последовательность получившихся значений. Поскольку мы передаем туда асинхронный метод, то то на выходе мы получим последовательность объектов Task. В свою очередь Task.WhenAll получает параметром последовательность этих тасков и возвращает в свою очередб один, типа как "таск тасков", т.е. таск, который будет завершен, когда завершатся все переданные ему таски. А самый верхний await (который await Task.WhenAll(...)) он уже "ждет" когда завершится этот "таск тасков" и результат его выполнения (массив строк) отдает дальше. Это можно переписать и без LINQ, просто на циклах, но, в данном случае, это будет длиннее.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025276
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok,

Вот, может так понять будет проще:

Код: vbnet
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.
Module Program

    Async Function Main(args As String()) As Task
        Dim count = 100
        Dim url = "foo.bar.baz"
        Dim tasks As New List(Of Task(Of String))

        For i = 0 To count - 1
            tasks.Add(DoRequest(url))
        Next

        Dim whenAll = Task.WhenAll(tasks)
        Dim results = Await whenAll

        ' В results у нас массив результатов всех запросов
        For Each r In results
            Console.WriteLine(r)
        Next
    End Function

    Async Function DoRequest(url As String) As Task(Of String)
        Dim webRequest = HttpWebRequest.Create(url)
        Using response = Await webRequest.GetResponseAsync()
            Using stream = response.GetResponseStream()
                Using reader = New StreamReader(stream)
                    ' Здесь можно сделать что-то с результатом отдельного запроса
                    Return Await reader.ReadToEndAsync()
                End Using
            End Using
        End Using
    End Function

End Module


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

это код понятен, всё работает, большое спасибо) только он ведь однопоточный, что подтверждает
Код: vbnet
1.
Console.WriteLine(Thread.CurrentThread.ManagedThreadId)

код доходит до получения ответа первого соединения и, если ответ не готов, идёт дальше создавать второе соединение. когда ответ первого соединение готов, программа останавливает выполнение действий, возвращается к первому соединению, выполняет получение ответа и обработку, идёт дальше. и если ответы двух соединений получены одновременно, программа примет их последовательно. отсюда 40 одинаковых запросов выполняются в 4 раза дольше 1 соединения. да, не в 40 за счёт асинхронных ожиданий, но всё-таки не параллельно, а каждая миллисекунда критична
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025519
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat, добавь ему ConfigureAwait ))
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025521
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
fkthat,

это код понятен, всё работает, большое спасибо) только он ведь однопоточный, что подтверждает
Код: vbnet
1.
Console.WriteLine(Thread.CurrentThread.ManagedThreadId)


код доходит до получения ответа первого соединения и, если ответ не готов, идёт дальше создавать второе соединение. когда ответ первого соединение готов, программа останавливает выполнение действий, возвращается к первому соединению, выполняет получение ответа и обработку, идёт дальше. и если ответы двух соединений получены одновременно, программа примет их последовательно. отсюда 40 одинаковых запросов выполняются в 4 раза дольше 1 соединения. да, не в 40 за счёт асинхронных ожиданий, но всё-таки не параллельно, а каждая миллисекунда критична

Если ты хочешь распараллелить еще и обработку, то тебе надо саму обработку запускать в пуле потоков с помощью Task.Run(...). Но учти, что если у тебя много времени занимает именно обработка запроса, то в любом случае выгода будет только если у тебя много ядер CPU.

Вот, например, как-то так:


Код: vbnet
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.
Module Program

    Sub Main(args As String())
        Dim count = 100
        Dim url = "foo.bar.baz"
        Dim tasks As New List(Of Task)

        For i = 0 To count - 1
            tasks.Add(DoRequest(url))
        Next

        Dim whenAll = Task.WhenAll(tasks)
        whenAll.Wait()
    End Function

    Async Function DoRequest(url As String) As Task
        Dim webRequest = HttpWebRequest.Create(url)
        Using response = Await webRequest.GetResponseAsync()
            Using stream = response.GetResponseStream()
                Using reader = New StreamReader(stream)
                    Dim result = Await reader.ReadToEndAsync()
                    ' Запускаем обработку результата запроса
                    Await Task.Run(Sub
                        HandleRequestResult(result)
                    End Sub)
                End Using
            End Using
        End Using
    End Function

    Sub HandleRequestResult(result As String)
        ' Здесь какая-нибудь долгая обработка запроса
    End Function
End Module


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

Я что-то и не подумал, что у него может быть GUI. Но, если большую часть времени отнимает ожидание IO, то это для общей производительности некритично, т.к. основной поток все равно почти всегда будет не занят.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025558
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,

поменял строки
Код: vbnet
1.
2.
Sub Main(args As String())
whenAll.Wait()

на
Код: vbnet
1.
2.
Async Sub Main(args As String())
Await whenAll

а то всё виснет намертво

спасибо, теперь обработка полученного результата параллельная, а непосредственно получение ответа ведь нет? там под миллион строк, может, они удлиняют выполнение в несколько раз?
в моём представлении нужно 100 потоков, по потоку на соединение, в каждом происходит обращение, получение ответа, обработка. если так нельзя\не принято, то почему? время на создание потоков\соединений, затраченная память, изношенность процессора не играет роли, т.к. это можно сделать заранее
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025568
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как считывание ответа с сервера разбить хотя бы на 4 потока? по принципу: пришёл ответ, считывается первым потоком. во время считывания пришёл второй ответ, он не прерывает/не дожидается считывания первого ответа, а считывается вторым потоком. заняты два потока - третьим. в теории это будет гениально. по сути, "многопоточное ожидание". отдельно многопоточность и отдельно ожидание теперь знаю, как делать, а вместе... подскажете?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025573
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В последнем примере HandleRequestResult запускается в отдельной задаче, то есть работают независимо т друг друга не ждут. Если только ты сам своим кодом не завязываешь их друг на друга.

Но вообще, по идее неплохо бы СНАЧАЛА разобраться, как работает многопоточность и TPL в NET, а потом уже писать какой-то многопоточный код, а не наоборот. Хотя бы разобраться на примере уже написанного кода. Ведь fkthat не будет вечно за тебя программу писать, нужно какие-то собственные знания наращивать.
...
Рейтинг: 0 / 0
параллельные запросы 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
параллельные запросы HttpWebRequest
    #40025781
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, да. что не так делаю?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025782
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
Shocker.Pro, да. что не так делаю?
ты не ждешь, когда завершится метод АА

напиши хотя бы так
Код: c#
1.
2.
3.
4.
5.
6.
        static async void Main(string[] args)
        {
            await AA();
            Console.WriteLine("Hello World!");
        }
        static async Task AA()
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025783
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,
Код: vbnet
1.
Ошибка	CS5001	Программа не содержит статического метода "Main", подходящего для точки входа
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025784
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.
32.
33.
34.
35.
36.
37.
private async void button1_Click(object sender, EventArgs e)
{
    ServicePointManager.ServerCertificateValidationCallback = (_1, _2, _3, _4) => true;
    ServicePointManager.DefaultConnectionLimit = 5;

    Stopwatch sw = new Stopwatch();

    // тут параллелим на 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();
        }))).ConfigureAwait(true);
    sw.Stop();
    // Console.WriteLine($"Сто потоков: {sw.ElapsedMilliseconds}");
    label1.Text = $"Сто потоков: {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().ConfigureAwait(false);
        using var stream = response.GetResponseStream();
        using StreamReader reader = new StreamReader(stream);
        _ = await reader.ReadToEndAsync().ConfigureAwait(false);
    })).ConfigureAwait(true);
    sw.Stop();
    // Console.WriteLine($"Сто запросов асинхронно: {sw.ElapsedMilliseconds}");
    label2.Text = $"Сто запросов асинхронно: {sw.ElapsedMilliseconds}";
}



И у меня разница вообще в 60 раз получилась:

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

Код: c#
1.
2.
3.
4.
5.
        static void Main(string[] args)
        {
            AA();
            Console.WriteLine("Hello World!");
        }




Код: c#
1.
2.
3.
4.
5.
        static async Task Main(string[] args)
        {
            await AA();
            Console.WriteLine("Hello World!");
        }



qlewerok
Код: c#
1.
static async void AA()


Код: c#
1.
static async Task AA()
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025787
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthatразница вообще в 60 раз получиласьа теперь добавьте
Код: c#
1.
ThreadPool.SetMinThreads(100, 100);

студия очень скупая на потоки, если её убедительно не попросить
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025788
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
после многих запусков вердикт: коды работают одинаково по времени у меня. ServicePointManager.DefaultConnectionLimit действительно ни на что не влияет в этом языке
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025790
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
в этом языке
причем тут язык?
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025792
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
кто-то может писать на VB.NET при практически полном отсутствии ...

Скажу, что это не мешает писать на VB.NET и читать обычную документацию для.NET / экезмплы на C#.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025793
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro
причем тут язык?
в vb.net у меня прямая пропорциональность от этого параметра. увеличу в 3 раза максимально количество соединений - примерно в 3 раза быстрее выполнится код. тут как ни тыкал, разницы нет
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025796
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
в vb.net .... этого параметра
Это не параметр языка и к языку отношения не имеет.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025797
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD
Скажу, что это не мешает писать на VB.NET и читать обычную документацию для.NET / экезмплы на C#.
Это означает, что ты знаешь синтаксис C#. А ТС, увидев пример на C#, сразу запаниковал
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025798
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
студия очень скупая на потоки
то же самое. Причем тут студия? Код (хоть на C# хоть на VB.NET) можно писать в блокноте и на использование ThreadPool это никак не повлияет.

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

Это, наверняка потому что у тебя код CPU-consuming, т.е. он большую часть времени занят не отправкой HTTP-запроса и получением ответа, а обработкой самого этого ответа.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025807
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qlewerok
Код: c#
1.
ThreadPool.SetMinThreads(100, 100);


С такой настройкой оно у меня вообще зависло.
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025918
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
могу ошибаться, но в XP было ограничение на количество одновременных подключений по локальной сети больше 10 штук.
это касается не только соединений по самбе, но и других. Этого ограничения нет в серверных ОС.
вроде как это меняли в следующих виндах.
то есть, если одновременно больше 10 подключений не подключаются, возможно стоит глянуть в этом направлении, особенно если винда старая
...
Рейтинг: 0 / 0
параллельные запросы HttpWebRequest
    #40025921
qlewerok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, windows 7x64 SP1 максимальная
...
Рейтинг: 0 / 0
67 сообщений из 67, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / параллельные запросы HttpWebRequest
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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