
Hai, habrozhiteli! Buku Riccardo Terrell memberikan panduan tentang cara membuat program yang kompetitif dan dapat diukur dalam .NET, menyoroti manfaat dari paradigma fungsional dan menyediakan alat dan prinsip yang tepat untuk menjaga persaingan secara kompetitif dan mudah. Akibatnya, dengan dibekali keterampilan baru, Anda akan menerima pengetahuan yang diperlukan untuk menjadi ahli dalam memberikan solusi kinerja tinggi yang sukses.
Jika Anda menulis kode multithreaded dalam .NET, maka buku ini dapat membantu Anda. Jika Anda tertarik menggunakan paradigma fungsional untuk menyederhanakan pemrograman kompetitif dan memaksimalkan kinerja aplikasi, buku ini akan menjadi panduan penting bagi Anda. Ini akan menguntungkan setiap pengembang .NET yang ingin menulis aplikasi kompetitif, reaktif dan asinkron yang mengukur dan secara otomatis beradaptasi dengan sumber daya perangkat keras yang tersedia di mana pun program tersebut bekerja.
Struktur publikasi: peta jalan
Empat belas bab dari buku ini dibagi menjadi tiga bagian. Bagian I menyajikan konsep fungsional pemrograman kompetitif dan menjelaskan keterampilan yang diperlukan untuk memahami aspek fungsional penulisan program multithreaded.
- Bab 1 menjelaskan konsep dasar dan tujuan pemrograman kompetitif, serta alasan untuk menggunakan pemrograman fungsional untuk menulis aplikasi multi-utas.
- Bab 2 mengeksplorasi berbagai teknologi pemrograman fungsional untuk meningkatkan kinerja aplikasi multi-utas. Tujuan bab ini adalah untuk memberi pembaca konsep-konsep yang digunakan dalam sisa buku ini dan untuk memperkenalkan ide-ide kuat yang muncul dari paradigma fungsional.
- Bab 3 memberikan tinjauan umum tentang konsep fungsional kekekalan. Ini menjelaskan bagaimana immutabilitas digunakan untuk menulis program kompetitif yang dapat diprediksi dan mengoreksi dan untuk mengimplementasikan struktur data fungsional yang sifatnya aman.
Pada bagian II, berbagai model pemrograman kompetitif dalam paradigma fungsional diperiksa secara mendalam. Kami akan mengeksplorasi topik seperti Task Parallel Library (TPL), dan menerapkan pola paralel seperti Fork / Gabung, bagilah dan taklukkan, dan MapReduce. Bagian ini juga membahas tata letak deklaratif, abstraksi tingkat tinggi dalam operasi asinkron, pemrograman agen, dan semantik transfer pesan.
- Bab 4 menguraikan dasar-dasar pemrosesan paralel sejumlah besar data, termasuk template seperti Fork / Gabung.
- Bab 5 memperkenalkan metode yang lebih canggih untuk pemrosesan paralel sejumlah besar informasi, seperti agregasi paralel, reduksi data, dan implementasi templat MapReduce paralel.
- Bab 6 memberikan informasi terperinci tentang metode fungsional untuk memproses stream peristiwa (data) secara real time menggunakan operator fungsional tingkat tinggi di .NET Reactive Extensions untuk membentuk kombinator acara asinkron. Metode yang dipelajari kemudian akan digunakan untuk mengimplementasikan template reaktif penerbit-pelanggan yang dirancang secara kompetitif.
- Bab 7 memberikan penjelasan tentang model pemrograman berbasis tugas sebagaimana diterapkan pada pemrograman fungsional untuk menerapkan operasi kompetitif menggunakan template Monadic. Kemudian metode ini digunakan untuk membangun jalur pipa kompetitif berdasarkan paradigma pemrograman fungsional.
- Bab 8 dikhususkan untuk implementasi komputasi paralel tak terbatas menggunakan model pemrograman asinkron C #. Bab ini juga membahas metode penanganan kesalahan dan metode untuk membangun operasi asinkron.
- Bab 9 menjelaskan alur kerja asinkron dalam F #. Ini menunjukkan bagaimana penilaian yang ditangguhkan dan eksplisit dalam model ini memungkinkan untuk semantik komposisi yang lebih tinggi. Kemudian kita akan belajar bagaimana menerapkan ekspresi komputasi khusus untuk meningkatkan level abstraksi ke pemrograman deklaratif.
- Bab 10 menunjukkan bagaimana, berdasarkan pengetahuan yang diperoleh dalam bab-bab sebelumnya, kombinator dan template, seperti Functor, Monad, dan Applicative, dapat diimplementasikan untuk menyusun dan menjalankan beberapa operasi asinkron dan menangani kesalahan tanpa efek samping.
- Bab 11 menganalisis pemrograman reaktif menggunakan model pesan perangkat lunak. Ini mengungkapkan konsep isolasi alami sebagai teknologi yang melengkapi kekekalan dan memungkinkan penciptaan program kompetitif. Bab ini berfokus pada kelas MailboxProcessor yang digunakan dalam F # untuk mendistribusikan pekerjaan paralel menggunakan pemrograman agen dan pendekatan bebas sumber daya.
- Bab 12 menjelaskan pemrograman agen menggunakan perpustakaan TPL Dataflow dari .NET dengan contoh dalam C #. Ini menunjukkan bagaimana menerapkan agen stateless dan stateful di C #, serta bagaimana melakukan beberapa perhitungan secara paralel yang bertukar data satu sama lain, menggunakan (mengirim) pesan dalam gaya pipa.
Bagian III menunjukkan bagaimana mempraktikkan semua metode fungsional pemrograman kompetitif yang dipelajari dalam bab-bab sebelumnya.
- Bab 13 menyajikan serangkaian resep yang berguna untuk memecahkan masalah persaingan yang kompleks, yang diambil dari praktik nyata. Resep-resep ini menggunakan semua pola fungsional yang dijelaskan dalam buku ini.
- Bab 14 menjelaskan aplikasi lengkap yang dikembangkan dan diimplementasikan menggunakan templat kompetitif fungsional dan metode yang dipelajari dalam buku ini. Anda akan membuat aplikasi server yang sangat skalabel dan responsif dan program klien yang responsif. Buku ini berisi dua versi: satu untuk iOS (iPad), dibuat menggunakan Xamarin Visual Studio, dan yang kedua dibuat menggunakan Windows Presentation Foundation (WPF). Untuk memastikan skalabilitas maksimum dalam aplikasi server, kombinasi berbagai model pemrograman, seperti asinkron, agen, dan reaktif, digunakan.
Buku itu juga memuat tiga aplikasi.
- Lampiran A menjelaskan secara singkat konsep dasar pemrograman fungsional, serta menyajikan teori dasar metode fungsional yang digunakan dalam buku ini.
- Lampiran B mengungkapkan konsep dasar bahasa F #. Ini adalah ulasan dasar dari F #, yang akan memungkinkan Anda untuk berkenalan dengan bahasa ini dan merasa nyaman saat membaca buku.
- Lampiran B menunjukkan beberapa metode yang menyederhanakan interaksi antara alur kerja asinkron di F # dan tugas .NET di C #.
Kutipan. 11.6. F # MailboxProcessor: 10.000 agen untuk Game of Life
Dibandingkan dengan utas, MailboxProcessor dalam kombinasi dengan alur kerja asinkron adalah unit komputasi sederhana (primitif). Agen dapat muncul dan dihancurkan dengan biaya minimal. Anda bisa mendistribusikan pekerjaan di antara beberapa objek MailboxProcessor dengan cara yang sama seperti Anda bisa menggunakan utas, tanpa overhead tambahan yang terkait dengan membuat utas baru. Berkat ini, sangat mungkin untuk membuat aplikasi yang terdiri dari ratusan ribu agen yang bekerja secara paralel dengan beban minimum pada sumber daya komputer.
Di bagian ini, kita akan menggunakan beberapa contoh MailboxProcessor untuk mengimplementasikan game Game of Life (game "Life") (
wiki-eng dan
wiki-eng ). Menurut Wikipedia, Game of Life, dengan kata sederhana, adalah otomat seluler. Ini adalah gim tanpa pemain - dengan kata lain, saat gim dimulai dengan konfigurasi awal acak, gim ini berjalan tanpa input lainnya. Gim ini terdiri dari sekumpulan sel yang membentuk kisi; di setiap sel beberapa aturan matematika terpenuhi. Sel bisa hidup, mati, dan berlipat ganda. Setiap sel berinteraksi dengan delapan tetangga (sel tetangga). Untuk memindahkan sel sesuai dengan aturan ini, perlu untuk terus-menerus menghitung keadaan grid yang baru.
Game of Life memiliki aturan berikut:
- jika sel hanya memiliki satu tetangga atau tidak memiliki tetangga, maka ia mati "karena kesepian";
- jika empat atau lebih tetangga sel mati, maka ia mati "karena kelebihan populasi";
- jika sel memiliki dua atau tiga tetangga, maka ia tetap hidup;
- jika sel memiliki tiga tetangga, maka itu berkembang biak.
Tergantung pada kondisi awal, sel-sel membentuk struktur karakteristik sepanjang permainan. Melalui penerapan berulang dari aturan, generasi sel berikutnya dibuat sampai sel mencapai kondisi stabil (Gbr. 11.12).
Listing 11.9 memperlihatkan implementasi sel Game of Life AgentCell, berdasarkan tipe F # dari MailboxProcessor. Setiap sel agen berinteraksi dengan sel tetangga melalui pesan asinkron, sehingga menciptakan Game of Life yang sepenuhnya paralel. Untuk singkatnya, saya menghilangkan beberapa bagian dari kode, karena mereka tidak terkait dengan topik utama contoh. Anda akan menemukan implementasi penuh dalam kode sumber untuk buku ini, diposting di situs web penerbit.
AgentCell menjelaskan sel di kisi Game of Life. Konsep dasarnya adalah bahwa setiap agen bertukar informasi dengan sel-sel tetangga tentang keadaan saat ini melalui pesan asinkron. Templat ini membuat rantai komunikasi paralel yang saling berhubungan yang melibatkan semua sel mengirim negara mereka yang diperbarui ke MailboxProcessor updateAgent. Setelah menerima data ini, updateAgent memperbarui grafik di antarmuka pengguna (Listing 11.10).
updateAgent, seperti namanya, memperbarui keadaan setiap piksel sesuai dengan nilai sel yang diterima dalam pesan Pembaruan. Agen mempertahankan status piksel dan menggunakannya untuk membuat gambar baru saat semua sel meneruskan status baru mereka. UpdateAgent kemudian memperbarui GUI WPF menggunakan gambar baru ini yang cocok dengan kisi Game of Life saat ini:
do! Async.SwitchToContext ctx image.Source <- createImage pixels do! Async.SwitchToThreadPool()
Penting untuk dicatat bahwa updateAgent menggunakan konteks sinkronisasi saat ini untuk memperbarui pengontrol WPF dengan benar. Utas saat ini dialihkan ke utas antarmuka pengguna menggunakan fungsi Async.SwitchToContext (dijelaskan pada Bab 9).
Bagian terakhir dari kode untuk mengeksekusi Game of Life menghasilkan grid yang berfungsi sebagai taman bermain untuk sel, dan kemudian timer memberitahukan sel tentang perlunya melakukan pembaruan (Listing 11.11). Dalam contoh ini, kotak adalah kuadrat dari 100 × 100 sel, total 10.000 sel (objek MailboxProcessor), yang dihitung secara paralel dengan penghitung waktu setiap 50 ms, seperti yang ditunjukkan pada Gambar. 11.13. Sepuluh ribu objek MailboxProcessor berinteraksi dan memperbarui antarmuka pengguna 20 kali per detik (kode yang harus Anda perhatikan ditunjukkan dengan huruf tebal).
Pemberitahuan untuk semua sel (agen) dikirim secara paralel menggunakan PLINQ. Sel adalah urutan F # yang diperlakukan sebagai .NET IEnumerable, membuat LINQ / PLINQ mudah diintegrasikan.
Ketika kode dieksekusi, program menghasilkan 10.000 F # objek dari jenis MailboxProcessor dalam waktu kurang dari 1 ms, sementara agen menempati kurang dari 25 MB memori. Mengesankan!
Ringkasan
- Model pemrograman berbasis agen secara alami memberikan ketidakmampuan dan isolasi saat menulis sistem kompetitif, membuatnya lebih mudah untuk membahas sistem yang kompleks, karena agen dienkapsulasi dalam objek aktif.
- Manifes reaktif mendefinisikan properti untuk menerapkan sistem reaktif yang fleksibel, longgar, dan dapat diskalakan.
- Isolasi alami penting untuk menulis kode kompetitif tanpa memblokir. Dalam program multi-utas, isolasi memecahkan masalah status bersama dengan memberikan setiap utas potongan data yang disalin untuk melakukan perhitungan lokal. Saat menggunakan insulasi, tidak ada kondisi balapan.
- Menjadi asinkron, agen sederhana karena mereka tidak memblokir utas sambil menunggu pesan. Alhasil, Anda bisa menggunakan ratusan ribu agen dalam satu aplikasi tanpa banyak berdampak pada jumlah memori.
- Objek MailboxProcessor F # menyediakan komunikasi dua arah: agen dapat menggunakan saluran asinkron untuk mengembalikan (merespons) ke objek panggilan hasil perhitungan.
- Model pemrograman agen dalam F # melalui MailboxProcessor adalah alat yang sangat baik untuk memecahkan kemacetan dalam aplikasi, seperti beberapa akses database bersamaan. Bahkan, dengan bantuan agen, Anda dapat secara signifikan mempercepat pekerjaan aplikasi, sambil mempertahankan daya tanggap server.
- Bahasa pemrograman .NET lainnya memungkinkan Anda untuk menggunakan MailboxProcessor tipe F, menyediakan metode menggunakan model pemrograman TPL yang nyaman berdasarkan tugas.
»Informasi lebih lanjut tentang buku ini dapat ditemukan di
situs web penerbit»
Isi»
KutipanKupon diskon 20% untuk penjaja -
Konkurensi dalam .NETSetelah pembayaran versi kertas buku, versi elektronik buku dikirim melalui email.