1. 程式人生 > >python執行緒中join和和setDaemon

python執行緒中join和和setDaemon

  1. join([timeout]) 主執行緒A中,建立子執行緒B,B呼叫join函式會使得主執行緒阻塞,直到子執行緒執行結束或超時。引數timeout是一個數值型別,用來表示超時時間,如果未提供該引數,那麼主調執行緒將一直阻塞直到子執行緒結束。
    注意:必須在start() 方法呼叫之後設定。注意:必須在start() 方法呼叫之後設定。
import threading
import time


class MyThread(threading.Thread):
    def __init__(self, name):
        super(MyThread, self).__init__()
        self.num = 5
        self.name = name

    def run(self):
        print(self.name, ':start')
        while self.num:
            self.num -= 1
            time.sleep(1)
        print(self.name, ':over')


def main():

    t = MyThread('t')
    t.start()
    t.join()

    for i in range(5):
        print(i)

    print('main done!')

if __name__ == '__main__':
    main()

輸出如下:
t :start
t :over
0
1
2
3
4
main done!

如果不加入第行的t.join()則輸出如下,主執行緒不會等待子執行緒,並且主執行緒執行完後子執行緒仍在執行。

t :start
0
1
2
3
4
main done!
t :over
  1. setDaemon()方法。主執行緒A中,建立子執行緒B,B呼叫setDaemon(),即把主線設定為守護執行緒,如果主執行緒執行結束,則不管子執行緒B是否完成,一併和主執行緒退出。
    注意:必須在start() 方法呼叫之前設定。
import threading
import time

class MyThread(threading.Thread):
    def __init__(self, name):
        super(MyThread, self).__init__()
        self.num = 5
        self.name = name

    def run(self):
        print(self.name, ':start')
        while self.num:
            self.num -= 1
            time.sleep(1)
        print(self.name, ':over')

def main():

    t = MyThread('t')
    t.setDaemon(True)
    t.start()

    for i in range(5):
        print(i)

    print('main done!')

if __name__ == '__main__':
    main()