2010-08-12 43 views
10

Tôi đã hiểu rõ một điều gì đó cơ bản về thuộc tính daemon của đối tượng Python Thread.Tìm hiểu về các chủ đề daemon Python

xem xét như sau:

daemonic.py 

import sys, threading, time 

class TestThread(threading.Thread): 
    def __init__(self, daemon): 
     threading.Thread.__init__(self) 
     self.daemon = daemon 

    def run(self): 
     x = 0 
     while 1: 
      if self.daemon: 
       print "Daemon :: %s" % x 
      else: 
       print "Non-Daemon :: %s" % x 
      x += 1 
      time.sleep(1) 

if __name__ == "__main__": 
    print "__main__ start" 
    if sys.argv[1] == "daemonic": 
     thread = TestThread(True) 
    else: 
     thread = TestThread(False) 
    thread.start() 
    time.sleep(5) 
    print "__main__ stop" 

Từ các tài liệu python:

Các Python toàn bộ chương trình thoát khi không đề phi daemon sống còn lại.

Vì vậy, nếu tôi chạy với TestThread dưới dạng daemon, tôi hy vọng nó sẽ thoát khi chuỗi chính đã hoàn thành. Nhưng điều này không xảy ra:

> python daemonic.py daemonic 
__main__ start 
Daemon :: 0 
Daemon :: 1 
Daemon :: 2 
Daemon :: 3 
Daemon :: 4 
__main__ stop 
Daemon :: 5 
Daemon :: 6 
^C 

Tôi không nhận được gì?


Được đoán bởi Justin và Brent, tôi đã chạy bằng Python 2.5. Vừa mới về nhà và thử trên máy tính của riêng tôi chạy 2.7, và mọi thứ hoạt động tốt. Cảm ơn bạn đã giúp!

Trả lời

12

Hiểu biết của bạn về chủ đề daemon nên là đúng.

Tại sao điều này không xảy ra, tôi đoán bạn đang sử dụng phiên bản cũ hơn của Python. Các tài liệu Python 2.5.4 bao gồm một hàm setDaemon(daemonic), cũng như isDaemon() để kiểm tra xem một luồng có phải là một chuỗi daemon hay không. Tài liệu 2.6 thay thế các tài liệu này bằng cờ daemon có thể sửa đổi trực tiếp.

Tài liệu tham khảo:

http://docs.python.org/release/2.5.4/ (không daemon thành viên đề cập)

http://docs.python.org/release/2.6/library/threading.html (bao gồm daemon thành viên)

+0

Không nhận ra 'isDaemon' và' setDaemon' đã bị phản đối khá nhiều trong 2.7. Tốt để biết. –

6

Chỉ cần ra khỏi tò mò, những gì hệ điều hành và những phiên bản của python bạn có đang chạy?

Tôi đang sử dụng Python 2.6.2 trên Mac OS X 10.5.8.

Khi tôi chạy kịch bản của bạn, đây là những gì tôi nhận được:

bnash-macbook:Desktop bnash$ python daemon.py daemonic 
__main__ start 
Daemon :: 0 
Daemon :: 1 
Daemon :: 2 
Daemon :: 3 
Daemon :: 4 
__main__ stop 
Exception in thread Thread-1 (most likely raised during interpreter shutdown) 

Mà có vẻ như chính xác những gì bạn mong muốn.

Và đây là tương ứng với hành vi phi daemon (lên cho đến khi tôi chết quá trình):

bnash-macbook:Desktop bnash$ python daemon.py asdf  
__main__ start 
Non-Daemon :: 0 
Non-Daemon :: 1 
Non-Daemon :: 2 
Non-Daemon :: 3 
Non-Daemon :: 4 
__main__ stop 
Non-Daemon :: 5 
Non-Daemon :: 6 
Non-Daemon :: 7 
Non-Daemon :: 8 
Terminated 

vẻ đủ bình thường đối với tôi.

Các vấn đề liên quan