![]() 1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
||||||
Async/await и свой поток, как это сделать правильно?19.03.2016, 20:06. Показов 2454. Ответов 9
Метки нет Все метки)
(
короче классическая очередь задач, 1-99 потоков обрабатывают задачи по очереди
есть ли красивый и правильный путь как прикрутить async+await? смысл возни - хочу контролировать потоки, например сделать 1 поток для обращений к базе, или 3 потока для обработки чего-нибудь-полезного, вот именно 3 конкретных потока, а не task.Run минимальный пример рабочего, но некрасивого варианта - совершенно бессмысленный поток только ради ожидания
0
|
19.03.2016, 20:06 | |
Ответы с готовыми решениями:
9
Как правильно использовать async await
|
![]() ![]() 17810 / 12961 / 3381
Регистрация: 17.09.2011
Сообщений: 21,250
|
|
20.03.2016, 10:44 | |
А в каком месте он должен быть прикручен?
Тогда работайте с потоками напрямую или через TPL. async/await — это про разбиение задачи на неблокирующие куски, а не про потоки.
0
|
![]() ![]() |
|
20.03.2016, 12:30 | |
m0nax, если еще не читали, прочитайте в книге Албахари главу 14, там как раз рассматриваются вопросы, связанные с async-await. Но как выше верно сказано, ваша задача вряд ли решится с их применением.
Если просто, то рассмотрим такой вариант. К примеру, есть группа методов, некоторые из которых являются блокирующими. Нам надо их выполнить все. В классическом варианте, чтобы не повесить внешний код, нам их все придется запустить в отдельном потоке, даже если какие-то из них и не блокируют вызывающий код (выполняются быстро). А применение async-await позволяют, во-первых, запустить каждый из этих вызовов по отдельности, освобождая вызывающий поток после каждого вызова, и во вторых, позволяют получить результат (с возвратом в точку, где данный метод был вызван). Как аналог-использование итераторов. Там тоже механизм в чем-то похож. Если по терминологии Албахари, то Thread, Task - крупномодульный параллелизм, а async-await-мелкомодульный.
0
|
![]() 447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
|
||||||
20.03.2016, 14:18 | ||||||
Тот вариант который есть у вас не потокобезопасный, очередь редактируется из нескольких потоков.
Во вторых не рекомендуется поток пула забирать навсегда. Если вам нужен отдельный поток на все время жизни приложения - создайте его. Реализация очереди которая использует ThreadPool только если есть работа. Если работы нету, поток будет отпущен обратно в пул, до того момента пока он опять не понадобится.
0
|
![]() 1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
20.03.2016, 15:29 [ТС] | |
insite2012, не понимаю все эти рассуждения про разницу task и asynс, в 95% случаев это одно целое и совершенно не резделимо
я знаю всего два случая когда async != отдельный поток - сокеты и файлы, это зашито в ядре ОС через некий overlapped IO на уровне прерываний все остальные миллион вариантов использования async это _всегда_ отдельный поток, известный как Task.Run чтоб "освободить вызывающий поток" надо передать задачу другому потоку, либо упомянутые 2 исключения Добавлено через 5 минут ну а по теме - я понял что система тасков совершенно не гнется и не расширяется, либо как есть, либо никак Anklav спасибо конечно за труды, но это был код просто для наглядности накиданный за 3 минуты, а не рабочий вариант )
0
|
![]() ![]() |
|
20.03.2016, 16:44 | |
Разница там есть. Даже не разница, а понимание того, что дают эти ключевые слова.
0
|
Master of Orion
![]() ![]() |
|
20.03.2016, 17:46 | |
insite2012, async await это просто удобная обертка для ContinueWith, чтобы не было labma hell'а. Не больше не меньше. Никаких разных "уровней абстракций" там нет.
Ну делай 3 потока, в чем проблема? ![]()
0
|
Warrior
![]() 500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
|
|
20.03.2016, 20:06 | |
Берите BlockingCollection https://msdn.microsoft.com/ru-... 10%29.aspx
параметризируйте типом Action/Task/TaskCompletionSource Добавляем свои задачи Add(T) Создаем через фабрику сколько нужно потоков и вызываем в форыче у всех GetConsumingEnumerable() Если нужен совой заумный порядок который достает задачи есть коструктор который принимает IProducerConsumerCollection<T>
2
|
Master of Orion
![]() ![]() |
||||||
21.03.2016, 12:10 | ||||||
m0nax, как насчет BufferBlock<int>?
0
|
21.03.2016, 12:10 | ||||||
Помогаю со студенческими работами здесь
10
Socket.Send + Async & Await: свой асинхронный метод отправки данных Как использовать async и await Как работает async await? async/await как замена многопоточности Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
|
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
|
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
|
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
|
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
|
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
|
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
|
Реляционная модель и правила Кодда: фундамент современных баз данных
Codd 05.04.2025
Конец 1960-х — начало 1970-х годов был периодом глубоких трансформаций в области хранения и обработки данных. На фоне растущих потребностей бизнеса и правительственных структур существовавшие на тот. . .
|
Асинхронные операции в Django с Celery
py-thonny 05.04.2025
Разработчики Django часто сталкиваются с проблемой, когда пользователь нажимает кнопку отправки формы и. . . ждёт. Секунды растягиваются в минуты, терпение иссякает, а интерфейс приложения замирает. . . .
|
Использование кэшей CPU: Максимальная производительность в Go
golander 05.04.2025
Разработчикам хорошо известно, что эффективность кода зависит не только от алгоритмов и структур данных, но и от того, насколько удачно программа взаимодействует с железом. Среди множества факторов,. . .
|