Async/await не създава нови нишки?

+3 гласа
152 прегледа
попитан 2016 юни 8 от Nikoleta.V. (4,090 точки)

Обърканa съм. Колко Task-а могат да вървят паралелно на една нишка? Май имам грешна представа за паралната обработва. 

Това го пише в MSDN и не мога да го осмисля: 

Ключовите думи async и await не създават нови нишки. Асинхронните методи не изискват многонишковост защото асинхронния метод не върви на собствена нишка. Метода върви върху текущия synchronization context и използа време на нишката само когато методът е активен 

и това също 

Между започването на Task и изчакването му можете да пускате други task-ове. Те тихичко вървят паралелно, но не създават нови нишки. 

2 отговори

+1 глас
отговорени 2016 юни 8 от Viktor.Ivanov. (1,550 точки)

Не вървят паралелно, а се редуват. Когато прогресът е блокиран в един Task, той си запазва състоянието и предава контрола на готов Task. Това е кооперативно multitask-ване, а не реален паралелизъм. 

Нишките работят на същия принцип. Обаче има някои разлики. 

Първо, просто защото async/await не са нишки на операционната система: 

  • Task-овете не виждат ID-тата на нишките 
  • Thread-local storage не сменя автоматично контекста, когато някой Task предаде контрола на друг 

Второ, различно държание: 

  • Async/await използва кооперативно multitask-ване, а Win32 нишките използват pre-emption. Затова е нужно всички блокирани операции да връщат контрола чрез async/await модела. Може да се получи блокиране на цяла нишка с всичките и Task-ове заради извикване на функция, която не е направена да връща контрола върху нишката в случай, че блокира. 
  • Task-овете няма да се изпълнят паралелно на на многопроцесна система. Тъй като повторното влизане се контролира, това прави доста по-лесно запазването на консистентни структури от данни. 

Можеш да получиш едновременно изпълнение с много нишки от операционната система(с цялата им сложнотия и проблеми) ако използваш многонишков synchronization context. Но това,което си цитирал от MSDN, се отнася за случаите с една нишка. 

0 гласа
отговорени 2016 юни 8 от RoYaL (400 точки)
Не е нужно да се създава нова нишка, ако операционната система може да даде оперативно време на две задачки върху една и съща нишка.

http://stackoverflow.com/questions/600795/asynchronous-vs-multithreading-is-there-a-difference
...