powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про async и task
25 сообщений из 46, страница 1 из 2
Вопрос про async и task
    #39880151
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Везде твердят что асинхронные операции это не многопоточность. Ну ок. А что будет если скрестить ежа с ужом?

К примеру мне нужно скачать 100500 страниц из интернета. Я запускаю 100500 тасков и радуюсь жизни.

Но что будет если в тасках я буду использовать не request.GetResponse() а request.GetResponseAsync() ?

Даст это какойто проит? Например освободит на время сетевых ожиданий поток из пула для запуска другого таска, или все это ерунда, и этот асинк сам займет еще поток пула для себя?
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880160
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlВезде твердят что асинхронные операции это не многопоточность.
Это может быть многопоточность, а может быть и нет.

iskatelsqlНапример освободит на время сетевых ожиданий поток из пула для запуска другого таска, или все это ерунда, и этот асинк сам займет еще поток пула для себя?
Да, именно так примерно и будет. Поток, вызвавший операцию I/O не будет простаивать и ждать когда она завершится, а вернется в пул потоков, а когда операция I/O завершится, то из пула будет взят свободный поток и продолжит выполнение дальше по коду. Увеличивается паралельность кода. Рпаилизовано это с помошью системной штуки "I/O completion port" (виндовый аналог select/poll в юниксах).
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880161
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlВезде твердят что асинхронные операции это не многопоточность.

Вы хотели сказать: не равно, не тоже самое.

Т.е. вы что-то прочитали, упустили важную часть и теперь из-за этого возникло куча вопросов? :)
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880164
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880166
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatДа, именно так примерно и будет.
Ну ешкин кот, в вопросе или - или, ты отвечаешь "да". В блондинку перекрасился? :)

hVostt,

Да мы уже столько прочитали от разных авторов, что уже не только непонятно, но еще даже из "я" мы превратились в "мы" одна личность верит одному - другая другому...
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880171
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttiskatelsql,

Вот объяснение с картинками:

https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/

Я не читаю инглишь с листа, но пробежавшись понял, что там про асинхронность с основного потока, я же задаю вопрос - есть ли суть использовать асинхронность в тасках, которые уже больше ничего не делают кроме скачивания самих страниц. Т.е. единственное чем это может помочь - это внутренний механизм GetResponseAsync , который как-то освободит поток пула на время ожидания ответа сервера.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880172
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlЯ не читаю инглишь с листа, но пробежавшись понял, что там про асинхронность с основного потока, я же задаю вопрос - есть ли суть использовать асинхронность в тасках, которые уже больше ничего не делают кроме скачивания самих страниц. Т.е. единственное чем это может помочь - это внутренний механизм GetResponseAsync , который как-то освободит поток пула на время ожидания ответа сервера.

Конечно, запрос по сети это io операция, нет смысла ожидать её в потоке, занимая ценный ресурс.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880173
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlДа мы уже столько прочитали от разных авторов, что уже не только непонятно, но еще даже из "я" мы превратились в "мы" одна личность верит одному - другая другому...

Вы хотите поговорить об этом? :)
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880175
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlНу ешкин кот, в вопросе или - или, ты отвечаешь "да". В блондинку перекрасился? :)

Я блондин Правда, уже потихоньку седеть начал по возрасту. Объясняю по-другому. Есть Task. Это такая штука, которая сразу, без блокировки и ожидания возвращается из метода и просто гарантирует, что когда-нибудь она завершится (успехом или факапом, или отменой по запросу). Под капотом у этой Task может быть все что угодно - это может быть параллельный поток, может быть асинхронная операция, может быть вообще ожидание какого-нибудь события (нажатия кнопки, истечения срока таймера и т.п.), а может даже вообще ничего и не быть (т.е. таск выполняется синхронно в том же потоке и возвращается уже сразу завершенным). В твоем примере речь идет об асинхронном вызове (асинхронный I/O), как это работает в этом случае (т.е. что там у таска под капотом) я выше пояснил.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880176
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВы хотите поговорить об этом? :)

Хочу. Если меня называют на вы, значит мы уже двинулись...

Еще вопрос про пул - я явно понял что мин нужно сразу поднимать (для интернетов), ибо он изначально у меня 8 и раскачивается постепенно. Только пока он раскачивается вся программа бы уже выполнилась... Вот как быть с макс? резать его стремно, хз что еще в этом пуле, но кол-во обращений к серверу хотелось бы ограничить. Странная умная штуковина Task, с которой хрен поймешь как быть, старый добрый Thread проще и понятнее. Но надо ведь учиться новому :(
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880177
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlстарый добрый Thread проще и понятнее.
Ага. Особенно когда натыкаешься на говнокод в веб-приложении, который отжирает весь пул, или, еще хуже, плодит 1000+ кастомных потоков через CreateThread.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880181
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

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

Пока что нашел для себя что если пул с минимума сразу поднять, то таски вроде работают... Хотя в чем их прелесть так и не понял.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880187
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlХочу. Если меня называют на вы, значит мы уже двинулись...

Остались люди, и много, которые считают обращение на "ты" фамильярностью.
Дикость, но что поделаешь, не готов ещё мир к этому :)

iskatelsqlЕще вопрос про пул - я явно понял что мин нужно сразу поднимать (для интернетов), ибо он изначально у меня 8 и раскачивается постепенно. Только пока он раскачивается вся программа бы уже выполнилась... Вот как быть с макс? резать его стремно, хз что еще в этом пуле, но кол-во обращений к серверу хотелось бы ограничить. Странная умная штуковина Task, с которой хрен поймешь как быть, старый добрый Thread проще и понятнее. Но надо ведь учиться новому :(

Если хочется единственного ультимативного решения, его нет.
Давайте исходить из конкретных задач, а не переворачиванием сферического коня в вакууме.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880189
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsqlfkthat,

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

Пока что нашел для себя что если пул с минимума сразу поднять, то таски вроде работают... Хотя в чем их прелесть так и не понял.

Что может быть проще:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
static void Main() 
{
    Parallel.For(0, 100, _ => DoSomethingLongRunning());
}

static void DoSomethingLongRunning()
{
    // Something taking long time.
}



Если серьёзно, то прелестей у тасков много. Например, таск может возвращать результат. Для тасков есть унифицированный механизм отмены. Для тасков есть всякие утилиты как ContinueWith, WhenAny, WhenAll и т.д. Для тасков есть паттерн async/await Для тасков есть TPL. И т.д. и т.п. И опять-таки, в десятый раз - таски это вовсе не только многопоточность.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880190
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatИ опять-таки, в десятый раз - таски это вовсе не только многопоточность.

Ну ОК! таски - круто! Только расскажи как. Мне нужны 100500 страниц с инета.

Задаю 100500 тасков, и разгоняются они потихоньку, даж замерял, сначала по 2-3 в секунду, потом больше. Если пулу мин побольше задать то сразу побольше.

Как с этими тасками да с инетом? задача скачать быстро 100500 страниц.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880197
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
private static void Main(string[] args)
{
	// parallel tasks limit
	var maxThreads = 32;

	// 100500 URLs
	var urls = new Uri[] {
		// ...
		// ...
	};

	Parallel.ForEach(urls,
		new ParallelOptions { MaxDegreeOfParallelism = maxThreads },
		(url, state, i) => DownloadFromUrl(url));
}

private static void DownloadFromUrl(Uri url)
{
	// do it!
}
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880198
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

Выше был пример с параллельностью, но без асинхронного I/O. С асинхронным I/O будет самую малость хитрее:

Код: 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.
private static void Main()
{
    // parallel task limit
    var maxThreads = 32;

    // 100500 URLs
    var urls = new Uri[] {
        // ...
        // ...
    };

    var urlIndex = 0;
    var tasks = new LinkedList<Task>();

    while(urlIndex < urls.Length || tasks.Count > 0)
    {
        if(tasks.Count < maxThreads)
        {
            tasks.AddLast(
                DownloadFromUrlAsync(urlsIndex++]));
        }
        else
        {
            tasks.Remove(
                Task.WhenAny(tasks).Result);
        }
    }
}

private static Task DownloadFromUrlAsync(Uri url)
{
    throw new NotImplementedException("Implement it!");
}
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880606
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iskatelsql,

Кроме потоков есть ещё ограничение на количество одновременно открытых соединений. И оно отнюдь не бесконечно.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880611
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКроме потоков есть ещё ограничение на количество одновременно открытых соединений. И оно отнюдь не бесконечно.
Ну, я выше как раз аж целых два примера привел, как кол-во одновременных тасков ограничить.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880614
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttКроме потоков есть ещё ограничение на количество одновременно открытых соединений. И оно отнюдь не бесконечно.
Ну, я выше как раз аж целых два примера привел, как кол-во одновременных тасков ограничить.

Мне кажется лучше всего тут подойдёт DataFlow, вообще для задачи выкачивания. Там и асинк из коробки и дросселирование...

А ещё можно увеличить количество соединений, но не до бесконечности опять же :))
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880626
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМне кажется лучше всего тут подойдёт DataFlow, вообще для задачи выкачивания.
Да, сейчас мельком глянул - надо будет присмотреться, что за зверь такой - раньше его как-то не замечал.
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880628
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatiskatelsql,

Выше был пример с параллельностью, но без асинхронного I/O. С асинхронным I/O будет самую малость хитрее:

Код: 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.
private static void Main()
{
    // parallel task limit
    var maxThreads = 32;

    // 100500 URLs
    var urls = new Uri[] {
        // ...
        // ...
    };

    var urlIndex = 0;
    var tasks = new LinkedList<Task>();

    while(urlIndex < urls.Length || tasks.Count > 0)
    {
        if(tasks.Count < maxThreads)
        {
            tasks.AddLast(
                DownloadFromUrlAsync(urlsIndex++]));
        }
        else
        {
            tasks.Remove(
                Task.WhenAny(tasks).Result);
        }
    }
}

private static Task DownloadFromUrlAsync(Uri url)
{
    throw new NotImplementedException("Implement it!");
}



будет на индекс оф ранже падать. а так прикольно, спасибо!
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880629
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttи дросселирование...

это что такое?
какие-то смутные ассоциации с дросселями из электротехники...
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880633
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос про async и task
    #39880634
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachбудет на индекс оф ранже падать. а так прикольно, спасибо!
Да, надо
Код: c#
1.
if(tasks.Count < maxThreads)



заменить на
Код: c#
1.
if(tasks.Count < maxThreads && urlIndex < urls.Length)
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос про async и task
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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