Ref, Ejen dan Atom untuk Keadaan
Pelajari cara menggunakan primitif keserentakan teras Clojure untuk mengurus keadaan boleh ubah dengan selamat merentas bebenang
Ref, Ejen dan Atom untuk Keadaan ialah pelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM merangkumi sejumlah 4 pelajaran.
Pengenalan Keserentakan dan Keadaan
Mengurus keadaan dalam atur cara serentak adalah rumit! Apabila beberapa bahagian kod Anda cuba mengubah data yang sama pada masa yang sama, Anda mungkin menghadapi masalah besar seperti kerosakan data atau kebuntuan.
Clojure menawarkan alat yang berkuasa untuk mengendalikan keadaan boleh ubah yang dikongsi dengan selamat dan cekap.
Falsafah Keadaan Clojure
Clojure mengutamakan ketidakbolehubahan secara lalai. Ini bermaksud struktur data tidak berubah selepas dicipta. Namun, bagaimana jika Anda benar-benar perlu mengubah sesuatu, seperti pembilang atau baki pengguna?
- Clojure menyediakan primitif keserentakan khas.
- Primitif ini mengurus keadaan boleh ubah secara terkawal.
- Primitif ini memastikan perubahan selamat, walaupun merentasi berbilang bebenang.
Atom: Keadaan Bebas
Atom ialah cara paling mudah untuk mengurus satu bahagian keadaan boleh ubah yang bebas. Ia sesuai untuk perkara seperti pembilang atau penanda.
- Kemas kini adalah segerak dan atomik (sama ada semuanya berlaku atau tiada yang berlaku).
- Atom menggunakan gelung Compare-And-Swap (CAS) secara dalaman.
- Paling sesuai untuk keadaan yang tidak perlu diselaraskan dengan bahagian keadaan lain.
Contoh Kod Atom
Mari kita lihat Atom beraksi. Kita akan mencipta pembilang ringkas dan mengemas kininya.
(ns coddykit.core
(:gen-class))
(defn -main
"Demonstrates Clojure Atoms."
[& args]
(let [my-counter (atom 0)]
(println "Initial value:" @my-counter)
(swap! my-counter inc)
(println "After inc:" @my-counter)
(swap! my-counter + 5)
(println "After add 5:" @my-counter)))Penjelasan `swap!` Atom
Fungsi swap! penting untuk mengemas kini Atom:
- Fungsi ini menerima atom, satu fungsi dan argumen pilihan untuk fungsi tersebut.
(swap! my-atom inc)menambah nilai secara atomik.(swap! my-atom + 5)menambahkan 5 kepada nilai secara atomik.- Fungsi tersebut digunakan pada nilai semasa atom, dan hasilnya menjadi nilai baharu. Proses ini berlaku dengan cara yang selamat untuk bebenang.
Ref: Keadaan Diselaraskan
Ref digunakan untuk mengurus keadaan boleh ubah yang diselaraskan. Ini bermaksud Anda mempunyai beberapa bahagian keadaan yang mesti berubah bersama-sama, atau tidak berubah langsung.
- Ref menggunakan Memori Transaksi Perisian (STM) Clojure.
- Perubahan berlaku dalam transaksi (blok
dosync). - Semua perubahan dalam transaksi sama ada berjaya atau gagal sebagai satu kumpulan.
Contoh Kod Ref
Berikut ialah cara menggunakan Ref untuk memindahkan nilai antara dua akaun secara atomik. Jika satu operasi gagal, kedua-duanya dikembalikan kepada keadaan asal.
(ns coddykit.core
(:gen-class))
(defn -main
"Demonstrates Clojure Refs and STM."
[& args]
(let [account-a (ref 100)
account-b (ref 50)
amount-to-transfer 20]
(println "Initial: A=" @account-a "B=" @account-b)
(dosync
(alter account-a - amount-to-transfer)
(alter account-b + amount-to-transfer))
(println "After transfer: A=" @account-a "B=" @account-b)))Penjelasan STM dengan Ref
Blok dosync mentakrifkan transaksi:
refmencipta Ref baharu.altermengubah nilai Ref dalam transaksi. Ia menerima Ref, satu fungsi dan argumennya.- Jika mana-mana bahagian blok
dosyncgagal, semua perubahan dibatalkan. - Ini memastikan keatomikan: sama ada semuanya berlaku atau tiada yang berlaku.
Ejen: Keadaan Tak Segerak
Ejen direka untuk mengurus keadaan boleh ubah secara tak segerak dan berasingan. Ejen amat sesuai untuk tugasan yang mungkin mengambil masa atau berjalan di latar belakang tanpa menyekat jalur utama anda.
- Kemas kini dihantar sebagai mesej kepada Ejen.
- Ejen memproses mesej ini dalam jalur berasingan.
- Ini menyediakan pengasingan: keadaan ejen hanya berubah melalui pemprosesannya sendiri.
Contoh Kod Ejen
Mari gunakan Ejen untuk memproses senarai nombor secara tak segerak dan menjumlahkannya.
(ns coddykit.core
(:gen-class))
(defn -main
"Demonstrates Clojure Agents."
[& args]
(let [sum-agent (agent 0)]
(println "Initial sum:" @sum-agent)
(send sum-agent + 10)
(send sum-agent + 20)
(send sum-agent + 5)
(println "Waiting for agent to finish...")
(await sum-agent) ; Wait for all sent actions to complete
(println "Final sum:" @sum-agent)))Aliran Kerja Ejen
Beginilah cara Ejen berfungsi:
agentmencipta Ejen baharu dengan nilai awal.sendmenghantar fungsi dan argumen kepada ejen. Fungsi itu akan digunakan pada keadaan semasa ejen dalam jalur lain.- Ejen memproses mesej satu demi satu dalam jalurnya sendiri, sekali gus memastikan kemas kini yang terasing.
await(atauawait-for) digunakan untuk menyekat jalur semasa sehingga ejen selesai memproses semua tindakan yang belum selesai.
Memilih Primitif yang Tepat
Anda telah mempelajari Atom, Ref dan Ejen. Setiap satunya mempunyai tujuan khusus untuk mengurus keadaan boleh ubah dengan selamat.
Antara pernyataan berikut, yang manakah menerangkan dengan betul masa untuk menggunakan setiap primitif keserentakan?
Imbas Kembali: Pengurusan Keadaan
Dalam pelajaran ini, kita meneroka primitif keserentakan teras Clojure untuk mengurus keadaan boleh ubah dengan selamat:
- Atom: Untuk perubahan keadaan yang mudah, bebas dan segerak.
- Ref: Untuk perubahan keadaan yang diselaraskan dan bertransaksi merentas berbilang nilai menggunakan STM.
- Ejen: Untuk kemas kini keadaan secara tak segerak dan terasing, yang diproses dalam jalur berasingan.
Memahami alat ini amat penting untuk membina aplikasi Clojure yang kukuh dan serentak!
Pelajari Clojure dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 12
- Pelajaran
- 48
Soalan Lazim
Adakah pelajaran “Ref, Ejen dan Atom untuk Keadaan” percuma?
Ya — teks penuh “Ref, Ejen dan Atom untuk Keadaan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM, tingkat taraf kepada CoddyKit PRO. Kursus Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Ref, Ejen dan Atom untuk Keadaan”?
Pelajari cara menggunakan primitif keserentakan teras Clojure untuk mengurus keadaan boleh ubah dengan selamat merentas bebenang Anda berlatih Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Ref, Ejen dan Atom untuk Keadaan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM ini?
Ya. Setiap pelajaran Pengaturcaraan Fungsian Clojure dan Pembangunan Bahagian Belakang JVM menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Ref, Ejen dan Atom untuk Keadaan
- Memori Transaksi Perisian (STM)
- Janji, Masa Hadapan dan Operasi Tak Segerak
- Saluran core.async dan Blok Go