Async в ParallelFor

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Доброе утро знатоки. .
Есть код реализованный в кубике - Свой код C#. Код использует WinApi и последовательно направляет обращения к Api/
Для реализации многопотока код был "обернут" в ParallelFor по всем необходимым инструкциям и прекрасно выполняет свое назначение.
Каждый поток отправляет по 18 запросов, но как писал ранее - последовательно. Можно ли его заставить работать асинхронно?
Мое понимание асинхронности - блоки программы отвечающие за направление обращений будут делать это одновременно, не ожидая завершения выполнения предыдущего запроса. Поправьте меня если я неправильно понял принцип асинхронного выполнения кода в С#
Если я все таки правильно понял, то в ZP C# это необходимо реализовывать через Async?
Если я забрел "не туда" - то порекомендуйте - куда посмотреть чтобы реализовать одновременное выполнение нескольких блоков кодов?
Немного сумбурно, но думаю те кто занимался такими решениями поймут про что я
Спасибо и хорошего выходного всем.
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Спасибо. Я правильно понял в указанном Вами описании - каждый из потоков созданный через ParallelFor будет главным потоком обрабатывающим данные из субпотоков Treahd? То есть для каждого обращения к Api мне просто нужно создать субпотоки которые будут выполняться одновременно и возвращать данные в главный поток?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
лучше код скидывай. может ты неправильно там все сделал, а гадать, что не так у тебя в коде не очень охота.
есть подозрение что у тебя не так лок проставлен и поэтому все идет последовательно, так как ты спрашивал про лок для многопотока в другой теме... но это предположение :bk:
 

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
лучше код скидывай. может ты неправильно там все сделал, а гадать, что не так у тебя в коде не очень охота.
есть подозрение что у тебя не так лок проставлен и поэтому все идет последовательно, так как ты спрашивал про лок для многопотока в другой теме... но это предположение :bk:
Здравствуйте. Многопоток у меня работает нормально. То есть каждый из потоков работает как часы. Я просто хочу в рамках каждого потока сделать асинхронное выполнение кода. Каждый поток за итерацию выполняет 18 обращений, мне нужно чтобы эти 18 обращений в рамках потока шли параллельно, а не последовательно. В рамках КАЖДОГО потока.
А в случае с работой многопотока - нареканий нет, просто хочется "выжать" больше производительности из кода не за счет тупо увеличения количества потоков, а за счет оптимизации работы внутри каждого потока
Спасибо
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
Здравствуйте. Многопоток у меня работает нормально. То есть каждый из потоков работает как часы. Я просто хочу в рамках каждого потока сделать асинхронное выполнение кода. Каждый поток за итерацию выполняет 18 обращений, мне нужно чтобы эти 18 обращений в рамках потока шли параллельно, а не последовательно. В рамках КАЖДОГО потока.
А в случае с работой многопотока - нареканий нет, просто хочется "выжать" больше производительности из кода не за счет тупо увеличения количества потоков, а за счет оптимизации работы внутри каждого потока
Спасибо
Не факт что вы получите какой либо прирост по вашей задумке. Вполне возможно и наоборот.

По потокам приложил общий пример, ознакомитесь с принципом подходов.
dotnet run

По async, как вы хотите сделать (судя по всему), пример ниже
 

Вложения

  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Не факт что вы получите какой либо прирост по вашей задумке. Вполне возможно и наоборот.

По потокам приложил общий пример, ознакомитесь с принципом подходов.
dotnet run

По async, как вы хотите сделать (судя по всему), пример ниже
Спасибо. Похоже на то что нужно. Пока Вы здесь - подскажите - есть ли какие нибудь нюансы с LOCK файлов в таком решении? Или же все стандартно?
И еще - переменные в такой связке (паралел и асинк) будут ли также являться потокобезопасными?
PS ПОТОКОНЕЗАВИСИМЫМИ
 
Последнее редактирование:

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Не факт что вы получите какой либо прирост по вашей задумке. Вполне возможно и наоборот.

По потокам приложил общий пример, ознакомитесь с принципом подходов.
dotnet run

По async, как вы хотите сделать (судя по всему), пример ниже
Спасибо за подсказки и помощь
При работе с сетью, решение действительно приобретает отрицательные значения (тупо забивается канал)
Да и код становится раздутым похожим на костыльную сборку
Придется переписывать логику (производительность в моем случае критично важна для бизнес процесса)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Здравствуйте. Многопоток у меня работает нормально. То есть каждый из потоков работает как часы. Я просто хочу в рамках каждого потока сделать асинхронное выполнение кода. Каждый поток за итерацию выполняет 18 обращений, мне нужно чтобы эти 18 обращений в рамках потока шли параллельно, а не последовательно. В рамках КАЖДОГО потока.
А в случае с работой многопотока - нареканий нет, просто хочется "выжать" больше производительности из кода не за счет тупо увеличения количества потоков, а за счет оптимизации работы внутри каждого потока
Спасибо
какая разница где происходит многопоток ? принцип то один и тот же.
и чем плохо, тупо увеличить количество потоков у шаблона ? что 1 поток в зенке и 18 потоков внутри одного потока, что 18 потоков в зенке и 1 поток внутри, жрать ресурсы будет одинокого и скорость работы будет тоже одинаковой. А если накосячил с локом, то и "тупо увеличить количество потоков" не выйдет, так как лок все превратит в однопоток. Поэтому и пишу, скидывай код. сколько раз уже так было, да все у меня нормально, это зенка косячная, ля-ля тополя. скидывает код, а там косяк на косяке, либо вечный цикл, либо лок не так прописан, либо еще что.
 
  • Спасибо
Реакции: DevOps

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 165
Благодарностей
744
Баллы
113
Мое понимание асинхронности - блоки программы отвечающие за направление обращений будут делать это одновременно, не ожидая завершения выполнения предыдущего запроса. Поправьте меня если я неправильно понял принцип асинхронного выполнения кода в С#
Это многопоточность, а не асинхронность

Для реализации многопотока код был "обернут" в ParallelFor по всем необходимым инструкциям и прекрасно выполняет свое назначение.
Каждый поток отправляет по 18 запросов, но как писал ранее - последовательно. Можно ли его заставить работать асинхронно?
Zenno запускает свой поток. ParallelFor запускает свои потоки в нутри потока Zenno + еще вы хотите внутри потоков ParallelFor запускать еще потоки.... Какая то белеберда. Не проще контролировать ко-во потоков используя механизм многопоточности самого ZennoPoster?
 

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
какая разница где происходит многопоток ? принцип то один и тот же.
и чем плохо, тупо увеличить количество потоков у шаблона ? что 1 поток в зенке и 18 потоков внутри одного потока, что 18 потоков в зенке и 1 поток внутри, жрать ресурсы будет одинокого и скорость работы будет тоже одинаковой. А если накосячил с локом, то и "тупо увеличить количество потоков" не выйдет, так как лок все превратит в однопоток. Поэтому и пишу, скидывай код. сколько раз уже так было, да все у меня нормально, это зенка косячная, ля-ля тополя. скидывает код, а там косяк на косяке, либо вечный цикл, либо лок не так прописан, либо еще что.
Нет, Вы не правы. Разница огромная
К примеру если Вы работаете с сетью - то да, ту ничего не поделаешь особо, выигрыш только в синхронной обработке входных данных, это дает прирост к производительности.
А вот если Вы работаете с обработкой текста - то выигрыш просто колосальный.
Представим вариант. У нас есть перечислитель технологий состоящий из 90 блоков. В каждом блоке есть паттерны обработки/поиска и.т.д. Причем в самом маленьком блоке всего 3 регулярки, в средних по 1500+ а в самом большом 18 000+ регулярок. Вот в этом случае - запусти хоть 1000 потоков - производительности не будет видно, а если внутри каждого потока выполнение блоков сделать асинхронно - то выигрыш до 32 раз!!!
За Ваше участие и помощь - Вам огромное спасибо. Зачем Вам мой шаблон, видимо для интереса, он рабочий и абсолютно не нуждается в никаких правках. Сейчас у него производительность в Lite версии по обработке всех DNS записей домена - выходит в пределах 1,2 -1,5 миллиона доменов в час при количестве treadhs -200 (выше не ставлю - канал нужен и для других целей). Я хотел таким "финтом с Acync"увеличить производительность, так как при обработке меньше 8 000 000 доменов в час - теряется смысл проекта в целом и шаблона в частности.
Спасибо
 

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Это многопоточность, а не асинхронность


Zenno запускает свой поток. ParallelFor запускает свои потоки в нутри потока Zenno + еще вы хотите внутри потоков ParallelFor запускать еще потоки.... Какая то белеберда. Не проще контролировать ко-во потоков используя механизм многопоточности самого ZennoPoster?
Я видимо так написал что меня не поняли. Я хочу чтобы блоки кода внутри каждого потока выполнялись паралельно, а не последовательно.
PSВопрос уже решил при помощи Hartwell
В первом случае не добился производительности, во втором увеличил производительность в 32 раза (постобработка)
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Скорее всего вопрос стоит в "Lite" версии.... :bk:
У пользователей Про версии вообще не возникает проблем с поднятием потоков. Разбить рабочий процесс на обработку в несколько потоков , будь то парсинг или обработка текста или парсинг DNS записей не составляет большого труда. Все зависит от разработчика. Ну конечно если Lite версия, то еще и от ограничений лицензии :ca:
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Скорее всего вопрос стоит в "Lite" версии.... :bk:
У пользователей Про версии вообще не возникает проблем с поднятием потоков. Разбить рабочий процесс на обработку в несколько потоков , будь то парсинг или обработка текста или парсинг DNS записей не составляет большого труда. Все зависит от разработчика. Ну конечно если Lite версия, то еще и от ограничений лицензии :ca:
Как говорил кто то на форуме - Lite версия это трамплин для прокачки скиллов и поджопник для оптимизации :-)))
Если честно, то после подсказок на форуме, в том числе и при помощи от Вас лично разобрался в легкости "оборачивания" в ParallelFor - вообще не вижу смысла в прошке :-))) Да и вообще у меня нет ни одного шаблона на каких то других кубиках кроме "Свой код",
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 165
Благодарностей
744
Баллы
113
Если честно, то после подсказок на форуме, в том числе и при помощи от Вас лично разобрался в легкости "оборачивания" в ParallelFor - вообще не вижу смысла в прошке :-)))
Это ток если шаблон без браузерный
 
  • Спасибо
Реакции: DevOps и doc
Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
C#:
Task[] tasks = new Task[10];

for (int i = 0; i < 10; i++)
{
    tasks[i] = Task.Run(() => project.SendInfoToLog("Поток №: " + i, true));
}

Task.WaitAll(tasks);
Пример
 
Последнее редактирование:
  • Спасибо
Реакции: burhanov88 и DevOps

Dr.Pipetka

Client
Регистрация
12.12.2017
Сообщения
1 236
Благодарностей
804
Баллы
113
Дык параллельность это вообще миф:-) Асинхронность немного разгрузит железо . (выделенный поток не будет занят бесполезной хренью и сможет заниматься чем то другим). Например Thread.Sleep(500) занял себе поток на 500мс, await Task.Delay(500) может в эти 500мс делать что то другое(типа ресурсы грамотно распределять).
ЗЫ сам далек от асинхронности.
 

palman67

Client
Регистрация
06.06.2020
Сообщения
28
Благодарностей
6
Баллы
3

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
Тогда может стоит перейти на чисты c#?
он скоро поймет, что работать с запросами удобнее без зенки, создавая обычные приложения в визуалке. зенка в лайте только ограничивает полет фантазии.
и совсем другая ситуация когда надо подымать больше чем 1 поток на браузере.
но зачем торопить события ? у каждого своя скорость и свой путь :-)
 

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Тогда может стоит перейти на чисты c#?
он скоро поймет, что работать с запросами удобнее без зенки, создавая обычные приложения в визуалке. зенка в лайте только ограничивает полет фантазии.
и совсем другая ситуация когда надо подымать больше чем 1 поток на браузере.
но зачем торопить события ? у каждого своя скорость и свой путь :-)
Вы абсолютно правы, чистый код гораздо эффективней, за прошедшие 2 месяца чуть ли не круглосуточной прокачки - я это понял. Да и 95% кода у меня в "Общем коде".
С Винформ тоже уже научился взаимодействовать.
Но не хватает скиллов для того, чтобы защитить какое то из своих решений от несанкционированного копирования и распространения. В ZP это легко решаемо путем передачи закрытых шаблонов или ботов. Логика и принципы защиты приложений уже понятны, но не хватает времени изучить нюансы. И дело не в коммерческой разработке, или зарабатывании, а в том что нет желания отдавать уникальные коллекции словарей, коллекций, паттернов и.т.д. кому то за красивые глаза. Поэтому пока юзаю ZP
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
Л
Спасибо. Похоже на то что нужно. Пока Вы здесь - подскажите - есть ли какие нибудь нюансы с LOCK файлов в таком решении? Или же все стандартно?
И еще - переменные в такой связке (паралел и асинк) будут ли также являться потокобезопасными?
PS ПОТОКОНЕЗАВИСИМЫМИ
Используем потокбезопасные методы. Листайте доку на майкрософте, там есть и списки специально для этого и другие методы.

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

Ну и момент перыванием там довольно заковыристый. Мне нужно было запускать параллельные потоки с общим для всех условием, при достижении каким либо потоком выполнять завершение цикла for parallel. Смотрите так-же документацию, там довольно много моментов, в зависимости от того какой метод используется. Там либо передается сигнал завершения, после чего потоки в процессе должны по идеи завершить свой цикл, после чего будет выход. Для тасков юзают таймер или тип того. Найдете, обратите внимание главное на разницу между тасками и просто парралел for.
Да и я ни разу не гуру паралельного кодинга)) Не стоит все воспринимать за истину, я могу ошибаться,сам не разбирался от и до, но задачу решил все отлично работает.
З.ы. Долго не мог понять почему эксепшены возникали, оказалось что метод экранирования mysql.data похоже что не совсем потокобезопасный, вообщем пока не перебрал все строки по косточкам, потратив уйму времени, вынес эту операцию за цикл и все стало на свои места. Но в целом оно работало и так, просто раздрожали эксепшены, хотя они вообще не влияли на результат. К тому-же у меня там еще и простые операции File обычный с записью all text, и почему то мне я вполне уверен что и так сойдет, ибо по логике любая запись у меня будет всегда создавать новый файл с уник именем в каждом из потоков. Исключены по логике случая когда два потока могут обратится к одному имени. Но кто знает к чему это все может привести? Детонация ПК? Формат диска С? Установка фото генеталий в качестве фона рабочего стола :D?... Нет ну а вдруг? :-) Палка тоже вроде как раз в год выстреливает.
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
Л

Используем потокбезопасные методы. Листайте доку на майкрософте, там есть и списки специально для этого и другие методы.

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

Ну и момент перыванием там довольно заковыристый. Мне нужно было запускать параллельные потоки с общим для всех условием, при достижении каким либо потоком выполнять завершение цикла for parallel. Смотрите так-же документацию, там довольно много моментов, в зависимости от того какой метод используется. Там либо передается сигнал завершения, после чего потоки в процессе должны по идеи завершить свой цикл, после чего будет выход. Для тасков юзают таймер или тип того. Найдете, обратите внимание главное на разницу между тасками и просто парралел for.
Да и я ни разу не гуру паралельного кодинга)) Не стоит все воспринимать за истину, я могу ошибаться,сам не разбирался от и до, но задачу решил все отлично работает.
З.ы. Долго не мог понять почему эксепшены возникали, оказалось что метод экранирования mysql.data похоже что не совсем потокобезопасный, вообщем пока не перебрал все строки по косточкам, потратив уйму времени, вынес эту операцию за цикл и все стало на свои места. Но в целом оно работало и так, просто раздрожали эксепшены, хотя они вообще не влияли на результат. Но кто знает к чему это все может привести? Детонация ПК? Формат диска С? Установка фото генеталий в качестве фона рабочего стола :D?... Нет ну а вдруг? :-) Палка тоже вроде как раз в год выстреливает.
По Эксепшенам. Работает код обернутый в Tru Catch - по результатам которого заполняется одна переменная. Так вот уже час бьюсь - не могу эту переменную дальше данного блока использовать - не существует в контексте. В самом блоке она записывается в лист на выходе и просматривается в логах - но использовать ее вне блока не получается. Читал что переменная в такой обертке существует только в в этой обертке - как сделать ее доступной для дальнейшего применения?
Спасибо
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 691
Баллы
113
По Эксепшенам. Работает код обернутый в Tru Catch - по результатам которого заполняется одна переменная. Так вот уже час бьюсь - не могу эту переменную дальше данного блока использовать - не существует в контексте. В самом блоке она записывается в лист на выходе и просматривается в логах - но использовать ее вне блока не получается. Читал что переменная в такой обертке существует только в в этой обертке - как сделать ее доступной для дальнейшего применения?
Спасибо
объявить выше блока.
 
  • Спасибо
Реакции: DevOps

doc

Client
Регистрация
30.03.2012
Сообщения
8 607
Благодарностей
4 599
Баллы
113
По Эксепшенам. Работает код обернутый в Tru Catch - по результатам которого заполняется одна переменная. Так вот уже час бьюсь - не могу эту переменную дальше данного блока использовать - не существует в контексте. В самом блоке она записывается в лист на выходе и просматривается в логах - но использовать ее вне блока не получается. Читал что переменная в такой обертке существует только в в этой обертке - как сделать ее доступной для дальнейшего применения?
Спасибо
объявить до
 
  • Спасибо
Реакции: DevOps

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
По Эксепшенам. Работает код обернутый в Tru Catch - по результатам которого заполняется одна переменная. Так вот уже час бьюсь - не могу эту переменную дальше данного блока использовать - не существует в контексте. В самом блоке она записывается в лист на выходе и просматривается в логах - но использовать ее вне блока не получается. Читал что переменная в такой обертке существует только в в этой обертке - как сделать ее доступной для дальнейшего применения?
Спасибо
так обьявите ее в начале цикла или же если она по условию может быть статична для всех процессов то выносим вообще за цикл вверх

Еще цикл не должен возвращять вроде как ничего. Максимум обозначить пустым return; Но это все в рамках синхронного подхода. В асинке же иной принцип в корне.

C#:
string staticValue = "статичная переменная для всех";

// Начало паралельного For(i, vlaue...

string dynamicValue = "что-то что нам нужно у каждого потока свое";

try {
.....
dynamicValue = "поменяем сожержимое";

}
catch {
dynamicValue = "пускай тут присвоитсч этот текст";
}

Console.WriteLine(dynamicValue);
Console.WriteLine(staticValue);

); // закрываем парралельный цикл
 
  • Спасибо
Реакции: DevOps

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
313
Баллы
63
объявить выше блока.
так обьявите ее в начале цикла или же если она по условию может быть статична для всех процессов то выносим вообще за цикл вверх

Еще цикл не должен возвращять вроде как ничего. Максимум обозначить пустым return; Но это все в рамках синхронного подхода. В асинке же иной принцип в корне.

C#:
string staticValue = "статичная переменная для всех";

// Начало паралельного For(i, vlaue...

string dynamicValue = "что-то что нам нужно у каждого потока свое";

try {
.....
dynamicValue = "поменяем сожержимое";

}
catch {
dynamicValue = "пускай тут присвоитсч этот текст";
}

Console.WriteLine(dynamicValue);
Console.WriteLine(staticValue);

); // закрываем парралельный цикл
По Return - если в Catch эксепшен поставить return - куда выкидывает поток после этого?
Суть такова - есть 2 последовательных tru /catch и очень нужно после первого исключения не использовать дальнейший код. Но если исключение во втором блоке - то передавать новые условия и продолжать отработку следующих участков кода
Спасибо
Пытался во вложенный - но там логика -мозг сломал
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
По Return - если в Catch эксепшен поставить return - куда выкидывает поток после этого?
Суть такова - есть 2 последовательных tru /catch и очень нужно после первого исключения не использовать дальнейший код. Но если исключение во втором блоке - то передавать новые условия и продолжать отработку следующих участков кода
Спасибо
Пытался во вложенный - но там логика -мозг сломал
пишите ТГ в лс, а то уже вопросы за оффтоп выходят, да и слишком много их что-то.
 
  • Спасибо
Реакции: DevOps

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
Не факт что вы получите какой либо прирост по вашей задумке. Вполне возможно и наоборот.

По потокам приложил общий пример, ознакомитесь с принципом подходов.
dotnet run

По async, как вы хотите сделать (судя по всему), пример ниже
https://dotnetfiddle.net/rfI4Id


Интересный момент, при уменьшении Delay до 1, выполнение по очереди быстрее в 2 раза чем одновременно...
C#:
NotWhenAllOneAsync, total time 8
WithWhenAllAsync, total time 16
 
  • Спасибо
Реакции: DevOps

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
Async/await vs Parallel.For vs Task.Run
dotnet проект в архиве

Скомпилировать и запустить (требуется .net5.0). Распаковываем архив в папку, в ней компилируем (используйте Release, а не Debug)
C#:
dotnet restore
dotnet build -o Release
.\Release\_AsyncVsTask.exe

80060


Источник: csharp-async-vs-task-and-parallel

Добавлю от-себятены:
Параллельность - «параллелизм/concurrency» как "многопоточность/multithreading" - запуск множество потоков, работающих одновременно, выполняется каждым потоком свою задачу.
Асинхронность - это означает одновременное выполнение нескольких действий (async/await поддерживается параллелизм) позволяя одному потоку запускать один процесс, а затем делать что-то еще вместо ожидания завершения первого процесса.
  1. Parallel само по себе синхронная операция.
  2. Async / await - это разновидности синтаксического сахара, которые обеспечивают потенциал "параллелизма/concurrency", но не обязательно означает "многопоточность/multithreading".
Где-то будет разумнее и более продуктивен один подход, в каких-то задачах другой. Остается найти лишь компромисс где что использовать. Как-то так.
 

Вложения

  • Спасибо
Реакции: DevOps

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)