300 likes | 478 Views
Si s sejuhatus TPL raamistiku. Juri Mulenko Betgenius www.devclub.eu www.devclub.ee. Kava. Varasemad paralleel -t öötluse vahendid Task Parallel Library Taskide käivitamine Kombineerimine Tühistamine Vigade haldus Paar vihjet. Varasemad paralleel -t öötluse vahendid. Thread.
E N D
Sissejuhatus TPL raamistiku JuriMulenko Betgenius www.devclub.euwww.devclub.ee
Kava • Varasemadparalleel-töötluse vahendid • Task Parallel Library • Taskide käivitamine • Kombineerimine • Tühistamine • Vigade haldus • Paar vihjet
Muud • Veel 3 viisil delegaatide käivitamine • BeginXXX/EndXXX + Callback • WinformsBackgoundWorker • Oma ThreadPool • ... ?
Probleemid • Sarnasuse olemasolut kohe ei paista • Puudub üldine abstraktsioon • Keerulinekombineerida • Erinevad halduse viisid • Sünkroniseerimine • Tühistamine • Tulemuste analüüs
TPL Data Parallelism • Parallel.For() • Parallel.ForEach() PLINQ • ParallelQuery<T> • ParallelEnumerable extensions • .AsParallel() Task Parallelism
Task • Asünkroonse operatsiooni abstraktsioon = delegaatiAction/Funcümbrik ! • Taskiümber on ehitatud rikkas API
Käivitamine • var t = new Task(action); t.Start(); • Task.Factory.StartNew(action); • Parallel.Invoke(action[]);
Seisund ja tulemus • task.Result blokeerib thread’i kuni tulemus on kättesaadav • Töö kestel võib jälgida • task.Status • task.IsCompleted/IsCanceled/IsFaulted • Kasutame Task.WaitAll() / Task.WaitAny() mitmete taskide puhul
Kombineerimine • Jada ehitamine ContinueWith() abil • Sisemised taskid (Detached nested tasks) • Võsu taskid (Child tasks)
ContinueWith() Task1 Task1 TaskN Result Result
Sisemised taskid Task 2 Task1 Task 3 Task 4 R E S U L T
Võsu taskid Task 2 Task1 TaskCreationOptions .AttachedToParent Task 3 Task 4 r e s u l t
Tühistamine • Luua CancellationTokenSourceja lugeda selle .Token omadust • Kasutada CancellationTokentaski käivitamisel • Taski sees lugeda token.IsCancellationRequestedomadust • KutsudaCancellationTokenSource.Cancel()kuisoovimetaski tühistada
Vigade haldus • Kõik vead on pakkitud AggregateExceptionsisse • Võsu taskide vead lastakse läbi vanematele • Sisemiste taskide vead – EI. Peame ise hallata. • Võib ka oodata, kuni task on vea seisundis, ja siis vea hallata. .ContinueWith(TaskContinuationOptions.OnlyOnFaulted)
Paar väidet • Kõik taskid käivitakse ThreadPool’i sees • Ei garanteeri et: • taskid tegelikult töötavad paralleelselt • taskid lõpevad samas järjekorras, kui need on loodud • Thread’ide arv on võrdne jooksva taskide arvuga • paralleelne käivitamine toob kiirust juurde: • Context Switches • Kui ainult30% koodi saab paralleelset käivitada => eisaa 2x jõudsust kätte
Paar vihjed • ThreadPool on konfigureeritav. • Nii min kui ka maxthread’i arvu jaoks • Ettevaatust! Võib jõudlust maha lüüa • Unit - testimine?
Kokkuvõtteks • ThreadPool toob juurde paindlikuma resurside kasutust • API annab rohkem kontrolli operatsioonide üle – kombineerimine, jne • Üldised abstraktsioonid ja käitumine • TPL = +1 kasulikriist
Kasulikud viited • TPL @ MSDN http://msdn.microsoft.com/en-us/library/dd460717.aspx • Samples for Parallel Programming with the .NET Framework @ Code.MSDN http://code.msdn.microsoft.com/ParExtSamples • Pro .NET 4 Parallel Programming in C# (Expert's Voice in .NET) by Adam Freeman http://www.amazon.com/NET-Parallel-Programming-Experts-Voice/dp/1430229675
Aitäh! yuri.mulenko@gmail.com www.devclub.eu www.devclub.ee