Daemon Konuları Açıklama


237

In Python belgelerinde şöyle der:

Bir iş parçacığı "daemon iş parçacığı" olarak işaretlenebilir. Bu bayrağın önemi, yalnızca daemon evreleri kaldığında tüm Python programının çıkmasıdır. İlk değer oluşturma iş parçacığından devralınır.

Bunun ne anlama geldiğine dair daha net bir açıklaması veya konuları nerede ayarlayacağınızı gösteren pratik bir örneği var daemonicmı?

Bunu benim için netleştirin: iş parçacığı olarak ayarlayamayacağınız tek durum daemonic, ana iş parçacığı çıktıktan sonra çalışmaya devam etmelerini istediğiniz zamandır?

Yanıtlar:


448

Bazı iş parçacıkları, saklayıcı paketler gönderme veya periyodik çöp toplama işlemi gibi arka plan görevleri gerçekleştirir. Bunlar sadece ana program çalışırken yararlıdır ve diğer daemon olmayan iş parçacıkları çıktıktan sonra onları öldürmek uygundur.

Arka plan programı dizileri olmadan, programınızdan tamamen çıkabilmeniz için bunları izlemeniz ve çıkmalarını söylemeniz gerekir. Onları daemon iş parçacığı olarak ayarlayarak, çalışmasına ve unutmasına izin verebilirsiniz ve programınız kapandığında, tüm daemon iş parçacıkları otomatik olarak öldürülür.


1
Deamon olmayan bir dosya yazma işlemi gerçekleştiren bir alt iş parçacığı varsa Yani, bu açıkça çıkmak zorunda anlamına mı geliyor?
Ciasto piekarz

8
@san Yazar diziniz yazmayı bitirdikten sonra ne yapıyor? Sadece geri mi dönüyor? Eğer öyleyse, bu yeterli. Daemon iş parçacıkları genellikle bir döngü içinde çalışan ve kendiliğinden çıkmayan şeyler içindir.
Chris Jester-Young

Hiçbir şey yapmaz, ne döner, ne de dosya yazma işlemi gerçekleştirmek için tek amacı
Ciasto piekarz

2
@san Iş parçacığı işlevinin altından düşerse, örtük olarak geri döner.
Chris Jester-Young

Bu Nonedurumda geri döner , ancak önemli değil, dönüş değeri kullanılmaz.
Chris Jester-Young

30

Diyelim ki bir çeşit gösterge paneli widget'ı yapıyorsunuz. Bunun bir parçası olarak, okunmamış mesaj sayısını e-posta kutunuzda görüntülemesini istersiniz. Böylece küçük bir iplik yapacaksınız:

  1. Posta sunucusuna bağlanın ve kaç okunmamış mesajınız olduğunu sorun.
  2. Güncellenmiş sayımla GUI'ye sinyal gönder.
  3. Bir süre uyu.

Widget'ınız başladığında, bu iş parçacığını oluşturur, bir daemon olarak belirler ve başlatır. Çünkü bu bir arka plan programı, düşünmek zorunda değilsiniz; widget'ınız çıktığında, iplik otomatik olarak durur.


18

Diğer posterler, daemon thread'lerini kullanacağınız durumlar için bazı örnekler verdi. Ancak benim tavsiyem asla onları kullanmamak.

Yararlı olmadıkları için değil, ancak kullanırsanız karşılaşabileceğiniz bazı kötü yan etkiler olduğu için. Daemon iş parçacıkları, Python çalışma zamanı ana iş parçasındaki şeyleri parçalamaya başladıktan sonra da çalışabilir ve bazı tuhaf istisnalara neden olur.

Daha fazla bilgi burada:

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-February/343697.html

Kesinlikle onlara asla ihtiyacınız olmadığını söylemek, bazı durumlarda uygulamayı kolaylaştırır.


Python 3 ile hala bu sorun mu var? Belgelerde bu “tuhaf istisnalar” hakkında net bir bilgi yoktur.
kheraud

5
Joe'nun blog yazısından: "Güncelleme Haziran 2015: Bu Python hatası 1856. Python 3.2.1 ve 3.3'te düzeltildi, ancak düzeltme hiçbir zaman 2.x'e desteklenmedi. (2.7 şubeye geri dönme denemesi başka bir hataya neden oldu ve terk edildi.) Daemon konuları Python> = 3.2.1'de iyi olabilir, ancak kesinlikle önceki sürümlerde olmayabilir. "
clacke

Deneyimlerimi burada paylaşmak istiyorum: İş Parçacığı olarak defalarca ortaya çıkan bir işlevim vardı. İçinde bir Python örneği vardı loggingve iş parçacığını bitirdikten sonra tüm nesnelerin (her iş parçacığı / işlevi için dosya tanımlayıcıları) yok edilmesini bekledim. Programımın sonunda birçok çıktı gördüm IOError: [Errno 24] Too many open files:. İle lsof -p pid_of_program, FD'lerin açık olduğunu keşfettim, İş Parçacığı / İşlevlerinin işlerini bitirmesine rağmen. Geçici çözüm? İşlevin sonunda günlük işleyicisini kaldırma. Yani daemonicKonular, güvenilmez ...
ivanleoncz

17

Bunu düşünmenin daha basit bir yolu, belki de: ana geri döndüğünde, hala çalışan daemon olmayan iş parçacıkları varsa işleminizden çıkmaz.

Biraz öneri: İş parçacıkları ve senkronizasyon söz konusu olduğunda temiz bir kapatma yapmak kolay değildir - bundan kaçınabiliyorsanız bunu yapın. Mümkün olduğunca arka plan iş parçacıklarını kullanın.


13

Chris zaten daemon ipliklerinin ne olduğunu açıkladı, bu yüzden pratik kullanım hakkında konuşalım. Birçok iş parçacığı havuzu uygulaması görev çalışanları için arka plan programı iş parçacıkları kullanır. İşçiler, görevleri görev kuyruğundan yürüten iş parçacıklarıdır.

Çalışan, yeni görevin ne zaman görüneceğini bilmedikleri için görev kuyruğundaki görevleri süresiz olarak beklemeye devam etmelidir. Görev atayan evre (ana iş parçasını söyleyin) yalnızca görevlerin ne zaman bittiğini bilir. Ana iş parçacığı görev sırasını boşaltmak için bekler ve sonra çıkar. Çalışanlar kullanıcı iş parçacıklarıysa, yani daemon değilse, program sonlandırılmaz. İşçiler yararlı bir şey yapmasalar bile, bu süresiz çalışan işçileri beklemeye devam edecektir. Mark işçileri daemon iş parçacığı ve ana iş parçacığı görevleri halledilir bitmez onları öldürmekle ilgilenecektir.


4
Buna dikkat et! Bir program , bir arka plan görev kuyruğuna önemli bir görev gönderirse (örneğin, "arka planda" bazı dosyaları güncelleştirir), o dosyayı güncellemenin ortasında programın görevi yerine getirmeden önce veya daha da kötüsü sona erme riski vardır.
Solomon Slow

10

Chris'ten alıntı: "... programınız sona erdiğinde, arka plan programı iş parçacıkları otomatik olarak öldürülür.". Sanırım bu herşeyi özetliyor. Ana program tamamlandığında çalıştırıldığında aniden sona erdiği için bunları kullanırken dikkatli olmalısınız.


4

İkinci iş parçanız Daemon değilse, çıkış ölçütleri Daemon olmayan iş parçacıklarının da çıkışına bağlı olduğundan uygulamanızın birincil ana iş parçacığı sonlandırılamaz. Konular python'da zorla öldürülemez, bu nedenle uygulamanızın Daemon olmayan iş parçacıklarının çıkmasını gerçekten beklemesi gerekecektir. Bu davranış istediğiniz gibi değilse, ikinci iş parçacığınızı daemon olarak ayarlayın, böylece uygulamanızın çıkmasını engellemez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.