G‘afarov, A. F. Galimyanov parallel hisobiyotlar qo'llanma Qozon
Download 1.46 Mb.
|
ParVychGafGal (1)
- Bu sahifa navigatsiya:
- CancellationTokenSource
- Parallel LINQ (PLINQ)
- PLINQ
- Select iborasidan
- IEnumerable .
IsCancellationRequested har bir iteratsiya davomida yana tekshiriladi. Agar
rost, xabar ko'rsatiladi va tsikl tugaydi. Kodni ishga tushirishga harakat qiling va Enter tugmasini bosishdan oldin bir nechta iteratsiyalarni bajarishga ruxsat bering , shuning uchun vazifani bekor qiling. statik bo'shliq Main() { 87 Machine Translated by Google var tokenSource = new CancellationTokenSource(); var token = tokenSource.Token; var task = new Task(() => DoLongRunningTask(token), token); Console.WriteLine("Bekor qilish uchun Enter tugmasini bosing"); task.Start(); Console.ReadLine(); tokenSource.Cancel(); task.Wait(); task.Dispose(); Console.WriteLine("Chiqish uchun Enter tugmasini bosing"); Console.ReadLine(); } statik bekor DoLongRunningTask (CancellationToken tokeni) { agar (token.IsCancellationRequested) { Console.WriteLine("Uzoq davom etadigan vazifa boshlanishidan oldin bekor qilindi"); qaytish; } uchun (int i = 0; i <= 100; i++) { Console.WriteLine("{0}%", i); Thread.Sleep(1000); agar (token.IsCancellationRequested) { Console.WriteLine("Bekor qilingan"); sindirish; } 88 Machine Translated by Google } } Ko'p holatlarda siz bir nechta parallel vazifalarni bajarasiz. Qachon vazifani bekor qilish talab qilinadi, uning o'rniga vazifalar guruhini bekor qilishingiz mumkin faqat bitta. Bunga bir xil token yordamida erishiladi guruhdagi har bir vazifa uchun. Agar sizda bir nechta vazifalar guruhlari bo'lsa bekor qilinishi mumkin, uchun alohida CancellationTokenSource faylidan foydalaning har bir guruh uchun tokenlar yaratish. Parallel LINQ Language-Integrated Query (LINQ) deklarativ modelni taqdim etadi, kabi ma'lumotlar ketma-ketligini so'rash imkonini beradi xotiradagi to'plamlar, XML hujjatlari va ma'lumotlar bazasi ma'lumotlari. Xarakter ko'p so'rovlar ularni osongina parallellashtirish mumkinligini anglatadi. Ko'pchilik so'rovlar har bir element uchun bir xil harakatlar guruhini bajaradi to'plamlar. Agar bu harakatlarning barchasi mustaqil bo'lsa, nojo'ya ta'sirlarsiz ular paydo bo'lish tartibi sabab ta'sir, siz tez-tez mumkin Ishni taqsimlash orqali mehnat unumdorligining katta o'sishiga erishing bir nechta protsessor yadrolari o'rtasida. Ushbu stsenariylarni qo'llab-quvvatlash uchun .NET Framework versiyasi 4.0 Parallel LINQ (PLINQ) joriy etildi . PLINQ bir xil standartni taqdim etadi LINQ kabi so'rov operatorlari va so'rovlar ifodasi sintaksisi . Asosiy Farqi shundaki, dastlabki ma'lumotlar qismlarga bo'linishi mumkin ma'lumotlarni parchalash yordamida. Bu kichikroq ma'lumotlar guruhlari keyin potentsial ravishda barcha mavjud CPU yadrolari tomonidan qayta ishlanadi. PLINQ mavjud ba'zi cheklovlar, bu to'g'ridan-to'g'ri almashtirish emasligini anglatadi LINQ va so'rovlar uchun standart variant bo'lishi mumkin emas. uchun kalit cheklashlar soni individual qayta ishlash yon ta'siri, deb hisoblanadi qayta ishlash natijasi kabi manba ketma-ketliklaridan elementlar bir element boshqasiga bog'liq bo'lib, oldindan aytib bo'lmaydigan narsaga olib kelishi mumkin 89 Machine Translated by Google natijalar. Buning sababi, asl elementlar odatda yo'q asl tartibda qayta ishlanadi. Ikkinchi cheklov - bu PLINQ xotiradagi ma'lumotlar uchun parallellikni ta'minlaydi, masalan to'plamlar yoki oldindan yuklangan XML. LINQ so'rovini parallel uchun qanday o'zgartirish mumkinligini ko'rsatish qayta ishlash uchun sizga birinchi navbatda seriyali versiya kerak bo'ladi. Quyidagi kodda juda oddiy so'rovni ko'rsatadi. Bu erda biz o'z ichiga olgan massivdan boshlaymiz birdan o'ngacha bo'lgan butun sonlar. Select iborasidan foydalanib , loyihalashtiramiz uni asl kvadratlarni o'z ichiga olgan yangi ketma-ketlikka aylantiring qiymatlar. LINQ kechiktirilgan bajarishdan foydalanganligi sababli, yangi ma'lumotlar bo'lmaguncha ketma-ketlik yaratilmaydi mavjud. Bu foreach sikli so'rovning bajarilishiga sabab bo'lishini anglatadi va natijalarni chiqaradi. int[] ketma-ketligi = Enumerable.Range(1, 10).ToArray(); var kvadratlar = sequence.Select(x => x * x); foreach (kvadratdagi var kvadrat) { Console.Write(kvadrat + " "); } Console.ReadLine(); Natija: 1 4 9 16 25 36 49 64 81 100 LINQ interfeysni amalga oshiradigan ketma-ketliklar bilan ishlaydi IEnumerable |
ma'muriyatiga murojaat qiling