Topik ini membahas monitor sebagai pelengkap link yang kepentingannya berbeda: mengamati keberadaan satu proses tanpa terikat pada nasibnya. Pembahasan mencakup monitor/2, pesan DOWN yang dihasilkan, demonitor, dan pedoman memilih antara monitor dan link.
Monitor dan pesan DOWN#
Fungsi monitor/2 mendaftarkan pengamat satu arah: proses yang memantau akan diberi tahu saat proses yang dipantau berakhir, tetapi kegagalan proses yang dipantau tidak memengaruhi pengamatnya sama sekali. Nilai kembaliannya adalah referensi unik, dan saat proses yang dipantau berakhir, pesan tuple {'DOWN', Ref, process, PID, Alasan} masuk ke mailbox pengamat:
Erlang/OTP 29 [erts-17.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]
Eshell V17.1.1 (press Ctrl+G to abort, type help(). for help)
1> P = spawn(fun() -> receive after 30000 -> ok end end).
<0.87.0>
2> Ref = monitor(process, P).
#Ref<0.3394532810.1553727489.31008>
3> exit(P, selesai).
true
4> flush().
Shell got {'DOWN',#Ref<0.3394532810.1553727489.31008>,process,<0.87.0>,
selesai}Proses yang dipantau pada contoh hanya menunggu, sehingga satu-satunya cara ia berakhir adalah panggilan exit/2 dari shell. Pesan DOWN membawa empat hal yang dibutuhkan pengamat: referensi monitor, jenis sumber, PID proses yang berakhir, dan alasan berakhirnya. Referensi menjadi kunci pembanding yang aman ketika satu proses memantau banyak proses sekaligus, karena setiap pemantauan punya referensinya sendiri.
Kegagalan dan pesan DOWN#
Alasan pada pesan DOWN mencerminkan cara proses berakhir: alasan yang dikirim lewat exit/2, normal untuk berakhir secara normal, atau bentuk error semacam {badarith, ...} bila proses berhenti karena exception. Perilakunya konsisten: monitor tidak membatasi cara proses berakhir, dan pengamat tetap menerima satu pesan DOWN dalam semua kasus. Sifat ini membuat monitor cocok untuk pengelola sumber daya eksternal, misalnya proses yang menjaga koneksi jaringan, karena pengamat tetap hidup dan bebas memutus tindak lanjutnya sendiri.
Memantau proses yang sudah mati#
Monitor juga menangani kasus yang jarang dibicarakan: target sudah tidak ada saat monitor dibuat. Alih-alih gagal diam-diam, monitor segera mengirim pesan DOWN dengan alasan noproc, sehingga pengamat selalu menerima jawaban:
1> P = spawn(fun() -> ok end).
<0.87.0>
2> Ref = monitor(process, P).
#Ref<0.3827097070.213647362.112199>
3> flush().
Shell got {'DOWN',#Ref<0.3827097070.213647362.112199>,process,<0.87.0>,noproc}
okProses pada contoh berakhir seketika setelah dibuat, sehingga monitor yang menyusul langsung melaporkan noproc. Jaminan ini menghilangkan satu jenis ketidakpastian: pengamat tidak perlu menebak apakah target masih hidup, karena satu-satunya kontraknya adalah pesan DOWN pasti datang, entah saat target berakhir atau seketika saat monitor dibuat.
Melepas monitor#
Monitor yang tidak lagi dibutuhkan dilepas dengan demonitor/2. Opsi [flush] sekaligus membuang pesan DOWN yang mungkin sudah menunggu di mailbox, sehingga tidak ada jejak yang tertinggal:
5> demonitor(Ref, [flush]).
trueTanpa opsi [flush], pesan DOWN yang sudah dalam perjalanan tetap tiba dan harus ditangani oleh receive yang tepat. Detail ini penting pada kode yang memantau proses berumur pendek secara berulang, karena pesan DOWN dari monitor lama yang tak dibersihkan akan bercampur dengan pesan pemantauan baru.
Memilih antara monitor dan link#
Keduanya memberi tahu tentang berakhirnya proses, dan pilihannya ditentukan oleh kebutuhan: mempertahankan kebenaran bersama atau sekadar memperoleh informasi.
| Aspek | Link | Monitor |
|---|---|---|
| Arah | dua arah | satu arah |
| Akibat default | ikut berakhir | tidak ada, hanya pesan |
| Bentuk pemberitahuan | sinyal exit | pesan DOWN berreferensi |
| Penggunaan khas | pohon supervisi, kerja berpasangan | pengelola proses bantu, klien ke layanan |
Link menjawab hubungan yang saling bergantung untuk kebenaran: keduanya harus hidup atau mati bersama, dan supervisor memakai link pada seluruh pohon supervisinya. Monitor menjawab hubungan yang hanya memerlukan informasi: pengamat tetap hidup dan memutus sendiri tindakannya, sebagaimana klien yang memantau servernya lalu menyambung ulang saat menerima DOWN. Kedua mekanisme dapat dipakai bersamaan pada pasangan proses yang sama, dan OTP memakai keduanya sesuai peran masing-masing.
Kesalahan umum#
- Membaca pesan DOWN tanpa membandingkan referensinya. Pada proses yang memantau banyak target, pesan
DOWNdari target lain tertangkap oleh receive yang ceroboh. CocokkanRefdari kembalianmonitor/2pada pola receive, atau sertakan referensi di pesan permintaan-balasan. - Mengandalkan monitor untuk keselamatan bersama. Monitor tidak membuat proses ikut berakhir. Bila kebenaran program bergantung pada hidup-matinya target, yang dibutuhkan adalah link dan supervisi, bukan monitor.
- Membiarkan monitor tertanam pada loop yang berulang. Monitor yang dibuat ulang setiap iterasi tanpa
demonitor/2menumpuk pesanDOWNdi mailbox, dan pembersihannya menjadi pekerjaan yang tak pernah selesai.
Ringkasan#
- monitor/2 memantau satu proses secara satu arah dan mengembalikan referensi unik.
- Berakhirnya proses yang dipantau mengirim pesan {‘DOWN’, Ref, process, PID, Alasan} ke mailbox pengamat, tanpa memengaruhi hidup-matinya pengamat.
- demonitor/2 dengan opsi [flush] melepas monitor sekaligus membuang pesan DOWN yang menunggu.
- Link untuk hubungan yang benar bersama hidup dan mati, monitor untuk hubungan yang cukup diberi tahu. Pilihannya ditentukan oleh kebutuhan kebenaran, bukan selera.
Referensi#
- erlang:monitor — Ericsson — Dokumentasi resmi monitor, bentuk pesan DOWN, dan demonitor.
- Erlang Error Handling Guide — Ericsson — Panduan resmi link dan monitor dalam penanganan error antar proses.
- Learn You Some Erlang for Great Good! — Fred Hebert — Bab yang membandingkan link dan monitor dengan contoh.