Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/65: Рейтинг темы: голосов - 65, средняя оценка - 4.86
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377

Разница между асинхронным, многопоточным и параллельным программированиями

30.07.2021, 10:26. Показов 12996. Ответов 14

Студворк — интернет-сервис помощи студентам
Всем привет! Собственно вопрос обозначен в загаловке темы. Могу лишь уточнить, что не понятно.
Я понимаю, что асинхронное программирование, это когда код вызывается отдельно от другого кода и "идет/читается" асинхронно с другим, но в чем разница между многопоточным и параллельным тогда? Разве они не дают ту же возможность? Смотрел видео про асинхронное программирование, так там человек сказал, что потоки и асинки это одно и то же, только асинки проще, правда-ли это? Зачем и когда нужно применять три этих приема программирования?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.07.2021, 10:26
Ответы с готовыми решениями:

Каким лучше делать сервер — многопоточным, либо асинхронным?
Здравствуйте, возник такой вопрос. Каким лучше делать сервер - многопоточным, либо асинхронным? Прочитал множество тем и особой разницы не...

В чем разница между созданием асинхронных методов веб-службы и асинхронным вызовом синхронного метода веб-службы
Почитал msdn и Matthew MacDonald и возник следующий вопрос. В чем разница, между созданием асинхронных методов веб-службы и асинхронным...

синтез четырехразрядного счетчика с параллельным переносом между разрядами
нужно построить счетчик в системе logisim. Макс значение F, шаг минус три. положение счетчика застряло на d и 0. Не понимаю что делать,...

14
 Аватар для esperanto_qun
1124 / 656 / 393
Регистрация: 28.01.2021
Сообщений: 1,336
30.07.2021, 10:29
Лучший ответ Сообщение было отмечено cinekst_207 как решение

Решение

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

2. Асинхронность подразумевает, что операция может быть выполнена кем-то на стороне: удаленным веб-узлом, сервером или другим устройством за пределами текущего вычислительного устройства.

3. Многопоточное программирование подразумевает, что код приложения выполняется в разных потоках. Например, есть главный поток UI, и несколько рабочих потоков, которые выполняют тяжелые вычисления, результаты которых затем выводятся на UI.
7
7 / 7 / 5
Регистрация: 25.03.2018
Сообщений: 377
31.07.2021, 22:15  [ТС]
esperanto_qun, и все же, я видел, что делают TCP Socket через thread или через async. И в чем разница? По сути одно и то же.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.07.2021, 23:03
cinekst_207, потоки - это частный случай асинхронности, паралеллизм - частный случай многопоточности.
Многопоточность на одноядерном ЦП - та же асинхронность.
2
Эксперт .NET
 Аватар для Wolfdp
3788 / 1765 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.08.2021, 02:03
Цитата Сообщение от cinekst_207 Посмотреть сообщение
я видел, что делают TCP Socket через thread или через async. И в чем разница? По сути одно и то же.
Вот вам пример, когда вот ВООБЩЕ не одно и тоже

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    class Program
    {
        static List<TcpClient> clients = new List<TcpClient>();
        static ManualResetEvent l_server = new ManualResetEvent(false);
        static ManualResetEvent l_client = new ManualResetEvent(true);
 
        static void Main(string[] args)
        {
            Task.Run(Server);
            for (var i = 0; i < 1000; i++)
            {
                Client();
            }
            Console.WriteLine("Nya!");
            Test();
            Console.ReadKey();
        }
 
        static void Server()
        {
            var listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, 39027));
            listener.Start();
            while (true)
            { 
                var client = listener.AcceptTcpClient();
                new Thread(() =>
                {
                    var buff = new byte[100];
                    var stream = client.GetStream();
                    while (true)
                        stream.Read(buff, 0, 100);
                })
                    .Start();
                //Task.Run(async () =>
                //{
                //    var buff = new byte[100];
                //    var stream = client.GetStream();
                //    while (true)
                //        await stream.ReadAsync(buff, 0, 100);
                //});
 
                l_server.WaitOne();
                l_server.Reset();
                l_client.Set();
            }
        }
 
        static void Client()
        {
            l_client.WaitOne();
            l_client.Reset();
            var client = new TcpClient();
            client.Connect(new IPEndPoint(IPAddress.Loopback, 39027));
            clients.Add(client);
            l_server.Set();
        }
 
        static void Test()
        {
            var client = new TcpClient();
            client.Connect(new IPEndPoint(IPAddress.Loopback, 39027));
            var sw = new Stopwatch();
            var stream = client.GetStream();
            var buff = new byte[1024];
            new Random().NextBytes(buff);
            sw.Start();
            for(var i = 0; i < 1000000; i++)
                stream.Write(buff);
            sw.Stop();
            Console.WriteLine($"{sw.Elapsed}");
        }
    }
Цитата Сообщение от kolorotur Посмотреть сообщение
Многопоточность на одноядерном ЦП - та же асинхронность.
Не сказал бы. Асинхроный код подразумевающий запрос внешних данных будет работать пободрее.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
01.08.2021, 03:25
Цитата Сообщение от Wolfdp Посмотреть сообщение
Асинхроный код подразумевающий запрос внешних данных будет работать пободрее.
При чем здесь внешние данные, если речь о ЦП?
Или вы не то процитировали?
Многопоточность на одноядерном ЦП — типичная асинхронность, при которой планировщик ОС разбивает инструкции разных процессов/потоков на мелкие задачи и отдает на выполнение ЦП.
Если вы одновременно убираетесь дома, готовите ужин и отвечаете на форуме, переключаясь от одного к другому, то вы эти задачи выполняете асинхронно, хоть "поток" и один — вы.
1
Эксперт .NET
 Аватар для Wolfdp
3788 / 1765 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
01.08.2021, 15:25
Цитата Сообщение от kolorotur Посмотреть сообщение
При чем здесь внешние данные, если речь о ЦП?
Ок, чуть расшифрую:
-- да, действительно "многопоточность", как и "многозадачность" на ЦПУ на самом деле смахивает на асинхронность в том плане что потоков/задач значительно больше чем ядер и просто программе выделяется небольшой промежуток времени, чтобы она выполнила сколько успеет (либо сказала что пока выполнять нечего и время "списывается" для других задач)
-- речь все же идет про программировании на C#, и в отрыве от вакуумных коней формы шара, создать 100500 Thread и навесить на них задачу скажем выполнить запрос к sql, либо слушать TCP Socket -- менее эффективно, нежели использовать async-await. Пример выше я скидывал, если он ошибочный -- готов выслушать замечания.

Вообще я бы cinekst_207, посоветовал не слушать тут умные ответы, а написать десяток-другой прототив, выполняющих те или иные действия, в идеале перед этим разобраться с такой возможностью VS как многопоточная отладка. И замерить, что будет быстрее:
-- создать 1000 Thread или через Task.Run, чтобы понять что создание нового потока -- очень дорогое удовольствие и зачем нужен TaskPool.
-- насколько быстро запустятся через Task.Run первые 4 задачи, и как быстро будут стартовать последующие. Также можно поиграться с настройками пула, чтобы увидеть насколько "активней" будет создаваться новая задача при увеличении нижнего лимита, и поможет ли это выполнить быстрее все 1000 задач.
-- можно еще ограничить верхний лимит пула, попытаться его выбрать и посмотреть что произойдет с ожиданием callback для методов Begin после этого.
-- создать 1000 потоков, которые тупо ждут, и посмотреть насколько просядет выполнение других задач
-- посмотреть, создается ли отдельный поток при асинхронном запросе на внешний ресурс, и опять же проверить что работать будет быстрее: 1000 http запросов через async/Thread/Parallel.ForEach скажем на тот же google

Я думаю кто умный (явно не человек из видео, которое вы смотрели), подскажет еще кейсы для разбора многопоточного и асинхроного кода. Просто фраза "Асинхронность подразумевает, что операция может быть выполнена кем-то на стороне" вроде как и не ошибочная, но пока лапками не пощупаешь что оно такое и с чем едят -- большая вероятность что понимания не будет. Я тоже сначала думал "та асинхроность -- это просто сахар над многопоточностью", хотя это далеко не так.
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
07.08.2021, 10:35
Цитата Сообщение от Wolfdp Посмотреть сообщение
Вот вам пример, когда вот ВООБЩЕ не одно и тоже
Может я чего не доганяю....
А в чём разница?

async-await - это такое же выполнение на другом потоке только без явного его создания (используется пул потоков).
И с ожиданием выполнения задачи.

Вообще сравнивать Theard с async-await - некорректно.
Первое - это про выполнение в другом потоке.
Второе - это про ожидание результата выполнения.

Более-менее можно сравнивать Theard с Task.

Добавлено через 16 минут
Цитата Сообщение от cinekst_207 Посмотреть сообщение
я видел, что делают TCP Socket через thread или через async. И в чем разница? По сути одно и то же.
Разница в реализации ожидании выполнения задачи и прокидывании исключений в вызывающий поток.
Если не нужно ни того ни другого, то, скорее всего, и async-await не нужны.

Thead был изначально в .Net.
Но пользоваться им было неудобно.
Да и создание нового потока под каждый вызов метода довольно затратно.

В Framework 4 добавили пул потоков и, соответственно, различные методы работы с ним.
Для выполнения метода на пуле нужен Таск.
async-await служат для реализации методов в которых надо ожидать выполнения Тасков, но сами по себе они к асинхронности не имеют отношения. Они только облегчают её использование.
При этом при правильной реализации освобождение потоков должно происходить по глубине всей цепочки вызовов, что бы "не подвешивать", в том числе, и потоки пула.

Не все .Net методы реализуют эту концепцию async-await (с освобождением вызывающего потока).
Допустим, файловые асинхронные методы удерживают поток пула до завершения операции.

Такое же может происходить и при работе с сокетами.
В этом случае, если ОООООЧень много запросов выполняется одновременно, то могут закончится свободные потоки пула.
И реализация использующая явное создание Theard может оказаться более масштабируемой.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.08.2021, 12:34
Цитата Сообщение от Элд Хасп Посмотреть сообщение
async-await - это такое же выполнение на другом потоке только без явного его создания (используется пул потоков).
Это можно использовать для организации выполнения в отдельном потоке, но основное назначение — неблокирующее I/O, которое к потокам отношения не имеет.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Более-менее можно сравнивать Theard с Task.
Нельзя, Thread — это "работник", Task — это задача. Task — это приукрашенный делегат, с дополнительными свойствами типа статуса и исключения.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если не нужно ни того ни другого, то, скорее всего, и async-await не нужны.


Цитата Сообщение от Элд Хасп Посмотреть сообщение
В Framework 4 добавили пул потоков
Пул потоков существует в .NET с первой же версии — 1.1

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для выполнения метода на пуле нужен Таск.
Нет, хватает обычного делегата.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
файловые асинхронные методы удерживают поток пула до завершения операции.
Нет, не удерживают.
Все асинхронные методы в .NET, работающие с I/O, не блокируют потоки — в этом вся суть асинхронности — не блокировать потоки.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Такое же может происходить и при работе с сокетами.
И с сокетами тоже потоки не блокируются, т.к. I/O.
3
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
07.08.2021, 13:35
Цитата Сообщение от kolorotur Посмотреть сообщение
Это можно использовать для организации выполнения в отдельном потоке
Это же комментарий к конкретному коду.
Понятно, что это по сути несравнимые вещи.
Но в коде поста #5 предлагается сравнить ВЫПОЛНЕНИЕ обычного МЕТОДА в новом потоке, и выполнение асинхронного метода в задаче.

Цитата Сообщение от kolorotur Посмотреть сообщение
Пул потоков существует в .NET с первой же версии — 1.1
Не знал.
Я думал его ввели одновременно с Тасками.

Цитата Сообщение от kolorotur Посмотреть сообщение
Нет, не удерживают.
Все асинхронные методы в .NET, работающие с I/O, не блокируют потоки — в этом вся суть асинхронности — не блокировать потоки.
Блокируют не вызывающий поток, а поток на котором выполняются.

Наверное, я криво выражаюсь, но имел ввиду такую разницу.
C#
1
2
3
4
5
6
7
8
9
public async Task MethodAsync(int num)
{
       await Task.Delay(num);
}
 
public Task MethodAsync(int num)
{
       return Task.Run(()=>Theard.Sleep(num));
}
С файловыми операциями я столкнулся именно с тем, что поток пула не освобождается.
Где-то в разделе должна быть эта тема - надо поискать.
0
Эксперт .NET
 Аватар для Wolfdp
3788 / 1765 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.08.2021, 19:19
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А в чём разница?
Запустите и посмотрите за сколько выгрузит блок данных в первом случае и во втором.

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Все асинхронные методы в .NET, работающие с I/O, не блокируют потоки — в этом вся суть асинхронности — не блокировать потоки.
Чуть уточню -- они не просто не блокируют поток, а ОСВОБОЖДАЮТ поток до момента, пока не придет результат. Т.е. имея 1000 TCP подключений в режиме ожидания прихода данных это пипец как разгрузит сервак от лишних потоков.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
07.08.2021, 19:42
Цитата Сообщение от Wolfdp Посмотреть сообщение
Запустите и посмотрите за сколько выгрузит блок данных в первом случае и во втором.
Естественно создание потока и потом выполнение метода в нём будет затратнее чем выполнение метода в уже имеющимся потоке.
Но вопрос же был о принципиальной разнице между потоками и асинхронностью.
На примере этого кода такая разница не была продемонстрирована.

Цитата Сообщение от Wolfdp Посмотреть сообщение
Цитата Сообщение от kolorotur Посмотреть сообщение
Все асинхронные методы в .NET, работающие с I/O, не блокируют потоки
Чуть уточню -- они не просто не блокируют поток, а ОСВОБОЖДАЮТ поток до момента, пока не придет результат.
Если ничего не путаю вот в этой теме разбирались: Как устроено синхронное и асинхронное чтение файлов?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
07.08.2021, 19:48
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Блокируют не вызывающий поток, а поток на котором выполняются.
Не блокируют, если использовать асинхронные вызовы.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
имел ввиду такую разницу.
Task.Delay тоже ничего не блокирует.

Цитата Сообщение от Wolfdp Посмотреть сообщение
они не просто не блокируют поток, а ОСВОБОЖДАЮТ поток
Это определение "не блокировать поток": либо выполнять действия, использующие ЦП, либо освободить поток.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
07.08.2021, 20:34
Цитата Сообщение от kolorotur Посмотреть сообщение
Task.Delay тоже ничего не блокирует.
Знаю.
Я приводил его в противопоставлении с Thread.Sleep().

В теме, по указанной выше ссылке, у меня сложилось впечатление, что файловые операции удерживают (исполняющий, а не вызывающий) поток до завершения операции.

Хотя не спорю, что, возможно, там мы что0то не то набедокурили.
Если не трудно и есть время - посмотрите.
0
Эксперт .NET
 Аватар для Wolfdp
3788 / 1765 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
07.08.2021, 21:17
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Естественно создание потока и потом выполнение метода в нём будет затратнее чем выполнение метода в уже имеющимся потоке.
Я не про скорость создания, а про скорость выполнения при случае когда у нас есть 1000 ничего не делающих потоков Read, и когда есть 1000 ReadAsync. Вообще сейчас открыл тот пример что скидывал: синтетика явно не удачная, и чем больше данных нужно отправить, тем меньше разница отправки на финальной задаче. В некоторых случаях вообще вариант с new Thread отрабатывает шустрее.

Мне сейчас еще раз копать не хочется, могу только сказать что еще дополнительно тестировал как быстрее всего загрузить 100500 файлов с IIS. Вариант с неблокирующими тасками был найболее результативным.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2021, 21:17
Помогаю со студенческими работами здесь

Какая разница между различными сокетами (например, между 775 и 1155)?
Обясните пожалуйста какая разница между сокетами, пример есть сокет 775 и 1155 я понимаю что разем не тот процессора другие но! как насчет...

Стоит ли делать клиент многопоточным?
Сказали создать socks клиент сервер. клиент принимает все ссылки и далее передаёт их серверу. У меня вопрос: я знаю что сервер нужно...

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

Разница между --f и f--
Не понимаю, читал, что разницы между --f и f-- вообще никакой нет, но при компиляции программы выдаёт разные значения: #include...

Разница между 42.1 и 13.2?
Смотрел на сайте две версии 42.1 только 64 битные, а 13.2 и 32 и 64, но разницы не могу понять, что только биты? Добавлено через 2...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru