|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
в цикле в пуле потоков Код: vbnet 1.
запускаю каждое обращение к сайту в отдельном потоке Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
но всё равно запросы выполняются последовательно( подскажите, как заставить их обращаться параллельно, для 100 запросов время доходит до 20 секунд, что критично ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 22:37 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
Почему ты просто не используешь GetResponseAsync? К чему вся эта свистопляска с многопоточностью? На шарпе можно примерно так (на VB уже сам переводи, если что): Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 23:23 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
fkthat, если я буду получать асинхронные ответы, то запросы ведь я всё равно буду отправлять последовательно, а это долго. поэтому вынес запросы-ответы в отдельные потоки, но не помогает что-то ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 23:47 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
qlewerok запросы ведь я всё равно буду отправлять последовательно ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2020, 23:49 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
Shocker.Pro, я тупой и не могу прочесть( какие-то юсинги, енумераблы. сейчас сделал последовательную отправку запросов, повесил асинхронную обработку ответов, выполняется так же последовательно почему-то Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 00:13 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
fkthat, есть такой код на vb.net?) пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 00:20 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
qlewerok, На бейсике у меня вышло как-то так (я на нем ни разу в жизни не писал, т.ч. не знаю насколько это кошерно ): Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
А что, даже прикольно. Может мне на VB.NET мигрировать По-хорошему надо конечно еще try-catch расставить, чтобы один упавший запрос не факапил все 99 остальных, но это уже ньюансы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 00:27 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
qlewerok fkthat, есть такой код на vb.net?) пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 00:31 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
Shocker.Pro Сейчас попробовал. Он, похоже, даже C# 8 не понимает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 00:46 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
Ну значит ТС пусть на шарп переходит. Я абсолютно не понимаю, как кто-то может писать на VB.NET при практически полном отсутствии статей, учебников и документации. Даже Microsoft перестал включать в современную документацию примеры на VB.NET. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 00:58 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
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 . Так что я с миграцией на него все же поторопился :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 01:16 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
Сначала проверь, стоит ли вообще все в многопоток делать- может последовательно и быстрее получится конкретно в твоем случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 10:03 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
vb_sub Сначала проверь, стоит ли вообще все в многопоток делать- может последовательно и быстрее получится конкретно в твоем случае. Да на кой проверять. Многопоточность для I/O не нужна вообще никогда. Для него существуют неблокирующие async-вызовы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 10:17 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
fkthat, я честно пытался использовать код, и так и эдак его впихивал, но никак( синтаксис сложный для понимания или я тупой. в итоге вернулся к пулу потоков. так же в цикле отправляю в пул функцию без всяких асинхронностей (обращение и функция в самом посте). вывел в консоль номера потоков и обнаружил, что на 70 соединений у меня 3-4 потока. т.е. несмотря на умные статьи, где расхваливают автоматический подбор необходимого количества потоков, это чушь. задаю количество потоков и получаю прирост в несколько раз Код: vbnet 1.
далее увеличиваю количество одновременных соединений http и получаю прирост по скорости еще в несколько раз Код: vbnet 1.
. но всё равно код выполняется больше секунды для 70 соединений, это долго. что-то явно можно улучшить, буду благодарен, если подскажете, что. и цифры 20 и 50 я брал методом тыка. если увеличивать, начинают сыпаться ошибки соединения, какие цифры должны быть и от чего зависит, я хз( ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:35 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
qlewerok вернулся к пулу потоков. qlewerok Код: vbnet 1.
Ну что поделать, тут или разбираться, как это надо делать (т.е. без 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 . ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 13:46 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
fkthat, ваш код выполняется 6 секунд. если увеличить количество макс соединений до 9, выполняется за 1.5 секунд, как и мой. если 10 соединений, то начинает сыпаться подключение, от чего зависит, опять же, не знаю Код: vbnet 1.
хочу использовать ваш код, но в нём выносит мозг строка Код: vbnet 1.
все три слова впервые встречаю в языке. подскажете, как будет выглядеть код без неё? можно с разложением на несколько функций, а то там одна в другой как-то... и url у меня разные, передаются как раз в args As String() ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 14:37 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
qlewerok fkthat, ваш код выполняется 6 секунд. если увеличить количество макс соединений до 9, выполняется за 1.5 секунд, как и мой. если 10 соединений, то начинает сыпаться подключение, от чего зависит, опять же, не знаю Код: vbnet 1.
хочу использовать ваш код, но в нём выносит мозг строка Код: vbnet 1.
все три слова впервые встречаю в языке. подскажете, как будет выглядеть код без неё? можно с разложением на несколько функций, а то там одна в другой как-то... и url у меня разные, передаются как раз в args As String() Enumerable.Repeat(0, 100) это библиотечный класс/метод который генерирует последовательность из 100 нулей. Select(...) берет поочередно каждый элемент этой последовательности (в данном случае это просто 0, но нам он не нужен, важно что их будет 100) и вызывает для этого элемента переданную в этот метод функцию, а затем возвращает последовательность получившихся значений. Поскольку мы передаем туда асинхронный метод, то то на выходе мы получим последовательность объектов Task. В свою очередь Task.WhenAll получает параметром последовательность этих тасков и возвращает в свою очередб один, типа как "таск тасков", т.е. таск, который будет завершен, когда завершатся все переданные ему таски. А самый верхний await (который await Task.WhenAll(...)) он уже "ждет" когда завершится этот "таск тасков" и результат его выполнения (массив строк) отдает дальше. Это можно переписать и без LINQ, просто на циклах, но, в данном случае, это будет длиннее. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 14:56 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2020, 15:07 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
fkthat, это код понятен, всё работает, большое спасибо) только он ведь однопоточный, что подтверждает Код: vbnet 1.
код доходит до получения ответа первого соединения и, если ответ не готов, идёт дальше создавать второе соединение. когда ответ первого соединение готов, программа останавливает выполнение действий, возвращается к первому соединению, выполняет получение ответа и обработку, идёт дальше. и если ответы двух соединений получены одновременно, программа примет их последовательно. отсюда 40 одинаковых запросов выполняются в 4 раза дольше 1 соединения. да, не в 40 за счёт асинхронных ожиданий, но всё-таки не параллельно, а каждая миллисекунда критична ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 10:34 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
fkthat, добавь ему ConfigureAwait )) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:04 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
qlewerok fkthat, это код понятен, всё работает, большое спасибо) только он ведь однопоточный, что подтверждает Код: vbnet 1.
код доходит до получения ответа первого соединения и, если ответ не готов, идёт дальше создавать второе соединение. когда ответ первого соединение готов, программа останавливает выполнение действий, возвращается к первому соединению, выполняет получение ответа и обработку, идёт дальше. и если ответы двух соединений получены одновременно, программа примет их последовательно. отсюда 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:05 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
Shocker.Pro fkthat, добавь ему ConfigureAwait )) Я что-то и не подумал, что у него может быть GUI. Но, если большую часть времени отнимает ожидание IO, то это для общей производительности некритично, т.к. основной поток все равно почти всегда будет не занят. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 11:10 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
fkthat, поменял строки Код: vbnet 1. 2.
на Код: vbnet 1. 2.
а то всё виснет намертво спасибо, теперь обработка полученного результата параллельная, а непосредственно получение ответа ведь нет? там под миллион строк, может, они удлиняют выполнение в несколько раз? в моём представлении нужно 100 потоков, по потоку на соединение, в каждом происходит обращение, получение ответа, обработка. если так нельзя\не принято, то почему? время на создание потоков\соединений, затраченная память, изношенность процессора не играет роли, т.к. это можно сделать заранее ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 13:04 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
а как считывание ответа с сервера разбить хотя бы на 4 потока? по принципу: пришёл ответ, считывается первым потоком. во время считывания пришёл второй ответ, он не прерывает/не дожидается считывания первого ответа, а считывается вторым потоком. заняты два потока - третьим. в теории это будет гениально. по сути, "многопоточное ожидание". отдельно многопоточность и отдельно ожидание теперь знаю, как делать, а вместе... подскажете? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 13:34 |
|
параллельные запросы HttpWebRequest
|
|||
---|---|---|---|
#18+
В последнем примере HandleRequestResult запускается в отдельной задаче, то есть работают независимо т друг друга не ждут. Если только ты сам своим кодом не завязываешь их друг на друга. Но вообще, по идее неплохо бы СНАЧАЛА разобраться, как работает многопоточность и TPL в NET, а потом уже писать какой-то многопоточный код, а не наоборот. Хотя бы разобраться на примере уже написанного кода. Ведь fkthat не будет вечно за тебя программу писать, нужно какие-то собственные знания наращивать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2020, 13:43 |
|
|
start [/forum/topic.php?fid=20&msg=40025119&tid=1398409]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 273ms |
total: | 405ms |
0 / 0 |