Daemon เธรดคำอธิบาย


237

ในเอกสารประกอบของ Python มันบอกว่า:

เธรดสามารถถูกแฟล็กเป็น "daemon thread" ความสำคัญของการตั้งค่าสถานะนี้คือโปรแกรม Python ทั้งหมดจะออกเมื่อเหลือเพียง daemon thread เท่านั้น ค่าเริ่มต้นจะสืบทอดมาจากการสร้างหัวข้อ

ใครบ้างมีคำอธิบายที่ชัดเจนของสิ่งที่หมายถึงหรือตัวอย่างในทางปฏิบัติแสดงให้เห็นว่าคุณจะตั้งหัวข้อเป็นdaemonic?

ชี้แจงให้ฉัน: ดังนั้นสถานการณ์เดียวที่คุณจะไม่ตั้งกระทู้เป็นdaemonicคือเมื่อคุณต้องการให้พวกเขาทำงานต่อไปหลังจากที่ออกจากหัวข้อหลัก?

คำตอบ:


448

บางเธรดทำงานพื้นหลังเช่นส่งแพ็กเก็ตแบบ keepalive หรือดำเนินการรวบรวมขยะเป็นระยะหรืออะไรก็ตาม สิ่งเหล่านี้มีประโยชน์ก็ต่อเมื่อโปรแกรมหลักทำงานอยู่และก็ไม่เป็นไรที่จะฆ่าพวกมันเมื่อโปรแกรมอื่นที่ไม่ใช่ daemon ได้ออกจากเธรดแล้ว

หากไม่มีเธรด daemon คุณจะต้องติดตามพวกเขาและบอกให้พวกเขาออกก่อนที่โปรแกรมของคุณจะจบการทำงานอย่างสมบูรณ์ ด้วยการตั้งค่าให้เป็นเธรด daemon คุณสามารถให้พวกเขาเรียกใช้และลืมพวกเขาและเมื่อโปรแกรมของคุณหยุดทำงาน daemon เธรดใด ๆ จะถูกฆ่าโดยอัตโนมัติ


1
ดังนั้นถ้าฉันมีเธรดลูกที่กำลังทำการดำเนินการเขียนไฟล์ซึ่งตั้งค่าเป็น non-deamon นั่นหมายความว่าฉันต้องทำให้มันจบลงอย่างชัดเจนหรือไม่?
Ciasto piekarz

8
@san เธรดนักเขียนของคุณทำอะไรหลังจากเขียนเสร็จแล้ว มันเพิ่งกลับมา? ถ้าเป็นเช่นนั้นก็เพียงพอแล้ว เธรดภูตมักจะใช้สำหรับสิ่งที่ทำงานในลูปและไม่ออกด้วยตนเอง
Chris Jester-Young

มันไม่ทำอะไรเลยไม่ส่งคืนจุดประสงค์เดียวของมันในการดำเนินการเขียนไฟล์
Ciasto piekarz

2
@san ถ้ามันตกลงมาจากด้านล่างของฟังก์ชั่นเธรดก็จะส่งกลับโดยปริยาย
Chris Jester-Young

มันจะส่งคืนNoneในกรณีนั้น แต่ไม่สำคัญว่าจะไม่มีการใช้ค่าส่งคืน
Chris Jester-Young

30

สมมติว่าคุณกำลังสร้างวิดเจ็ตแดชบอร์ดอยู่บ้าง เป็นส่วนหนึ่งของสิ่งนี้คุณต้องการให้มันแสดงจำนวนข้อความที่ยังไม่ได้อ่านในกล่องอีเมลของคุณ ดังนั้นคุณทำหัวข้อเล็กน้อยที่จะ:

  1. เชื่อมต่อกับเซิร์ฟเวอร์อีเมลและถามจำนวนข้อความที่ยังไม่ได้อ่านที่คุณมี
  2. ส่งสัญญาณ GUI ด้วยจำนวนที่อัปเดต
  3. นอนหลับสักครู่

เมื่อวิดเจ็ตของคุณเริ่มทำงานมันจะสร้างเธรดนี้กำหนด daemon และเริ่มต้น เพราะมันเป็นภูตคุณไม่ต้องคิดอะไร เมื่อวิดเจ็ตของคุณออกเธรดจะหยุดโดยอัตโนมัติ


18

โปสเตอร์อื่นให้ตัวอย่างสำหรับสถานการณ์ที่คุณใช้ daemon เธรด อย่างไรก็ตามคำแนะนำของฉันไม่เคยใช้

ไม่ใช่เพราะมันไม่มีประโยชน์ แต่เนื่องจากมีผลข้างเคียงที่ไม่ดีคุณสามารถสัมผัสได้ถ้าคุณใช้ เธรด Daemon ยังคงสามารถเรียกใช้งานได้หลังจากรันไทม์ Python เริ่มฉีกสิ่งต่าง ๆ ในเธรดหลักทำให้เกิดข้อยกเว้นที่แปลกประหลาด

ข้อมูลเพิ่มเติมที่นี่:

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

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

พูดอย่างเคร่งครัดว่าคุณไม่ต้องการใช้มันเพียงทำให้การติดตั้งง่ายขึ้นในบางกรณี


ยังเป็นปัญหาของ python 3 นี้หรือไม่ ไม่มีข้อมูลที่ชัดเจนเกี่ยวกับ "ข้อยกเว้นที่แปลกประหลาด" เหล่านี้ในเอกสารประกอบ
kheraud

5
จากโพสต์บล็อกของ Joe: "อัปเดตมิถุนายน 2558: นี่คือPython bug 1856.มันได้รับการแก้ไขใน Python 3.2.1 และ 3.3, แต่การแก้ไขไม่ได้ถูกย้อนกลับไปที่ 2.x. (ความพยายามที่จะ backport ไปยังสาขา 2.7 ทำให้เกิดข้อผิดพลาดอื่น และมันก็ถูกทิ้งร้าง) Daemon threads อาจใช้ได้ใน Python> = 3.2.1 แต่แน่นอนว่าไม่ใช่รุ่นก่อนหน้า "
1111 clacke

ฉันต้องการแบ่งปันประสบการณ์ของฉันที่นี่: ฉันมีฟังก์ชั่นเกิดเป็นเธรดหลายครั้ง ข้างในนั้นฉันมีอินสแตนซ์ของ Python loggingและฉันคาดว่าหลังจากเสร็จสิ้นเธรดวัตถุทั้งหมด (File Descriptors สำหรับแต่ละเธรด / ฟังก์ชั่น) จะถูกทำลาย IOError: [Errno 24] Too many open files:ในตอนท้ายของโปรแกรมของฉันฉันเห็นผลมากมายเช่น ด้วยlsof -p pid_of_programฉันค้นพบว่า FDs นั้นเปิดแม้ว่ากระทู้ / ฟังก์ชั่นจะทำงานให้เสร็จ วิธีแก้ปัญหา? การลบตัวจัดการบันทึกในตอนท้ายของฟังก์ชั่น daemonicเธรดจึงไม่น่าไว้วางใจ ...
4464

17

วิธีที่ง่ายกว่าในการคิดเกี่ยวกับมันบางทีเมื่อผลตอบแทนหลักกระบวนการของคุณจะไม่ออกหากยังไม่มีเธรด daemon ที่ทำงานอยู่

คำแนะนำเล็กน้อย: การปิดระบบใหม่ทั้งหมดนั้นจะทำความผิดได้ง่ายเมื่อเธรดและการซิงโครไนซ์เกี่ยวข้อง - ถ้าคุณสามารถหลีกเลี่ยงได้ให้ทำเช่นนั้น ใช้ daemon เธรดทุกครั้งที่ทำได้


13

Chris อธิบายแล้วว่า daemon คืออะไรดังนั้นเรามาพูดถึงการใช้งานจริง การใช้เธรดพูลจำนวนมากใช้ daemon เธรดสำหรับผู้ปฏิบัติงาน Workers คือเธรดที่เรียกใช้งานจากคิวงาน

ผู้ปฏิบัติงานต้องรองานในคิวงานเรื่อย ๆ เนื่องจากไม่รู้ว่าจะมีงานใหม่เกิดขึ้นเมื่อใด หัวข้อที่มอบหมายงาน (พูดหัวข้อหลัก) รู้เฉพาะเมื่องานมากกว่า เธรดหลักรอคิวงานเพื่อให้ว่างแล้วออก หากคนทำงานเป็นผู้ใช้เธรดที่ไม่ใช่ daemon โปรแกรมจะไม่ยุติ มันจะคอยให้คนทำงานที่ไม่มีกำหนดเหล่านี้แม้ว่าคนงานจะไม่ทำสิ่งที่มีประโยชน์ ทำเครื่องหมายหัวข้อภูต daemon และเธรดหลักจะจัดการฆ่าพวกเขาทันทีที่จัดการงานเสร็จแล้ว


4
ระวังด้วย! หากโปรแกรมส่งงานที่สำคัญ (เช่นอัปเดตไฟล์บางไฟล์ "เป็นแบ็คกราวน์") ไปยังคิวงาน daemon แสดงว่ามีความเสี่ยงที่โปรแกรมจะยุติการทำงานก่อนที่จะดำเนินงานหรือแย่กว่านั้นในระหว่างการอัปเดตไฟล์นั้น
โซโลมอนช้า

10

Quoting Chris: "... เมื่อโปรแกรมของคุณหยุดทำงาน daemon เธรดใด ๆ จะถูกฆ่าโดยอัตโนมัติ" ฉันคิดว่าผลรวมมันขึ้น คุณควรใช้ความระมัดระวังเมื่อใช้งานเพราะมันสิ้นสุดลงทันทีเมื่อโปรแกรมหลักทำงานให้เสร็จ


4

เมื่อเธรดที่สองของคุณไม่ใช่แบบเดมอนเธรดหลักหลักของแอปพลิเคชันของคุณจะไม่สามารถออกได้เนื่องจากเกณฑ์การออกของมันถูกผูกไว้กับการออกของเธรดที่ไม่ใช่แบบเดมอนด้วย ไม่สามารถบังคับให้มีการฆ่าเธรดใน python ดังนั้นแอปของคุณจะต้องรอให้เธรดที่ไม่ใช่ Daemon หยุดทำงาน หากพฤติกรรมนี้ไม่ใช่สิ่งที่คุณต้องการให้ตั้งค่าเธรดที่สองเป็น daemon เพื่อไม่ให้แอปพลิเคชันของคุณไม่ทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.