Dalam dokumentasi Python dikatakan:
Sebuah utas dapat ditandai sebagai "utas daemon". Signifikansi flag ini adalah bahwa seluruh program Python keluar ketika hanya thread daemon yang tersisa. Nilai awal diwarisi dari untaian pembuatan.
Adakah yang memiliki penjelasan yang lebih jelas tentang apa artinya atau contoh praktis yang menunjukkan di mana Anda akan menetapkan utas daemonic
?
Perjelas untuk saya: jadi satu-satunya situasi Anda tidak akan menetapkan utas daemonic
, adalah kapan Anda ingin mereka terus berjalan setelah utas utama keluar?
sumber
None
dalam kasus itu, tetapi tidak masalah, nilai kembali tidak digunakan.Katakanlah Anda membuat semacam widget dasbor. Sebagai bagian dari ini, Anda ingin menampilkan jumlah pesan yang belum dibaca di kotak email Anda. Jadi, Anda membuat utas kecil yang akan:
Saat widget Anda mulai, itu akan membuat utas ini, menetapkannya sebagai daemon, dan memulainya. Karena ini adalah dasmon, Anda tidak perlu memikirkannya; ketika widget Anda keluar, utas akan berhenti secara otomatis.
sumber
Poster lain memberikan beberapa contoh untuk situasi di mana Anda akan menggunakan utas daemon. Rekomendasi saya, bagaimanapun, jangan pernah menggunakannya.
Ini bukan karena mereka tidak berguna, tetapi karena ada beberapa efek samping buruk yang dapat Anda alami jika Anda menggunakannya. Utas daemon masih bisa dijalankan setelah runtime Python mulai meruntuhkan hal-hal di utas utama, menyebabkan beberapa pengecualian yang cukup aneh.
Info lebih lanjut di sini:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343697.html
Sebenarnya Anda tidak pernah membutuhkannya, itu hanya membuat implementasi lebih mudah dalam beberapa kasus.
sumber
logging
dan saya berharap bahwa, setelah menyelesaikan Thread, semua objek (File Descriptor untuk setiap Thread / Fungsi), akan dihancurkan. Pada akhir program saya, saya melihat banyak output sepertiIOError: [Errno 24] Too many open files:
. Denganlsof -p pid_of_program
, saya menemukan bahwa FD terbuka, bahkan sulit Thread / Fungsi telah menyelesaikan pekerjaan mereka. Penanganan masalah? Menghapus penangan log di akhir fungsi. Jadidaemonic
Threads, tidak dapat dipercaya ...Cara yang lebih sederhana untuk memikirkannya, mungkin: ketika main kembali, proses Anda tidak akan keluar jika ada utas non-daemon yang masih berjalan.
Sedikit saran: Bersihkan shutdown mudah terjadi kesalahan ketika utas dan sinkronisasi terlibat - jika Anda bisa menghindarinya, lakukanlah. Gunakan daemon utas bila memungkinkan.
sumber
Chris sudah menjelaskan apa itu thread daemon, jadi mari kita bicara tentang penggunaan praktis. Banyak implementasi kumpulan utas menggunakan utas daemon untuk pekerja tugas. Pekerja adalah utas yang menjalankan tugas dari antrian tugas.
Pekerja harus terus menunggu tugas dalam antrian tugas tanpa batas karena mereka tidak tahu kapan tugas baru akan muncul. Utas yang memberikan tugas (katakan utas utama) hanya tahu kapan tugas selesai. Utas utama menunggu pada antrian tugas untuk menjadi kosong lalu keluar. Jika pekerja adalah utas pengguna yaitu non-daemon, program tidak akan berakhir. Ini akan terus menunggu pekerja yang berjalan tanpa batas ini, meskipun pekerja tidak melakukan sesuatu yang bermanfaat. Tandai pekerja daemon utas, dan utas utama akan mengurus membunuhnya segera setelah selesai menangani tugas.
sumber
Mengutip Chris: "... ketika program Anda berhenti, utas daemon apa pun terbunuh secara otomatis." Saya pikir itu merangkumnya. Anda harus berhati-hati ketika menggunakannya karena mereka tiba-tiba berakhir ketika program utama dieksekusi sampai selesai.
sumber
Ketika utas kedua Anda adalah non-Daemon, utas utama utama aplikasi Anda tidak dapat berhenti karena kriteria keluarnya dikaitkan dengan keluar juga dari utas non-Daemon. Utas tidak dapat dibunuh secara paksa dengan python, oleh karena itu aplikasi Anda harus benar-benar menunggu utas non-Daemon keluar. Jika perilaku ini bukan yang Anda inginkan, maka atur utas kedua Anda sebagai daemon sehingga tidak akan menahan aplikasi Anda untuk keluar.
sumber