python筆記9-多線程Threading之阻塞(join)和守護線程(setDaemon)

前言

今天小王請xiaoming和xiaowang吃火鍋,吃完火鍋的時候會有如下三種場景:python

  • 場景一:小王(主)先吃完了,海海(客)和老王(客)還沒吃完,這種場景會致使結帳的人先走了,剩下兩個小夥伴傻眼了。。。函數

  • 場景二:小王(主)先吃完了,海海和老王還沒吃飽,一塊兒結帳走人。spa

  • 場景三:小王(主)先等海海和老王吃飽了,小編最後結帳一塊兒走人。線程

主線程與子線程

場景一:主線程已經結束了,子線程還在跑3d

1.咱們把thread1.start()和thread2.start()稱爲兩個子線程,寫在外面的代碼就是主線程了。code



# -*- coding:utf-8 -*-
import time
import threading

def chiHuoGuo(people):
print("%s 吃火鍋的小夥伴-羊肉:%s" % (time.ctime(),people))
time.sleep(1)
print("%s 吃火鍋的小夥伴-魚丸:%s" % (time.ctime(),people))

class myThread(threading.Thread):
def __init__(self, people, name):
'''重寫threading.Thread初始化內容'''
threading.Thread.__init__(self)
self.threadNmae = name
self.people = people

def run(self):
print("開始線程:" + self.threadNmae)

chiHuoGuo(self.people)
print("結束線程:" + self.threadNmae)

if __name__ == "__main__":
# 啓動線程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")

thread1.start()
thread2.start()

time.sleep(0.1)
print("退出主線程:吃火鍋,結帳走人")

 

守護線程setDaemon()

場景二:主線程結束了,子線程必須也跟着結束orm

1.主線程中,建立了子線程 線程A和線程B,而且在主線程中調用了thread.setDaemon(),這個的意思是,把主線程設置爲守護線程,這時候,要是主線程執行結束了,就無論子線程是否完成,一併和主線程退出.
(敲黑板:必須在start()方法調用以前設置,若是不設置爲守護線程,程序會被無限掛起。)blog

2.線程有一個布爾屬性叫作daemon。表示線程是不是守護線程,默認取否。當程序中的線程所有是守護線程時,程序纔會退出。只要還存在一個非守護線程,程序就不會退出。
主線程是非守護線程。繼承

3.setDaemon(True)此方法裏面參數設置爲True纔會生效utf-8

# coding=utf-8
import threading
import time

def chiHuoGuo(people):
    print("%s 吃火鍋的小夥伴-羊肉:%s" % (time.ctime(),people))
    time.sleep(1)
    print("%s 吃火鍋的小夥伴-魚丸:%s" % (time.ctime(),people))


class myThread (threading.Thread):   # 繼承父類threading.Thread
    def __init__(self, people, name):
        '''重寫threading.Thread初始化內容'''
        threading.Thread.__init__(self)
        self.threadName = name
        self.people = people

    def run(self):   # 把要執行的代碼寫到run函數裏面 線程在建立後會直接運行run函數
        '''重寫run方法'''
        print("開始線程: " + self.threadName)

        chiHuoGuo(self.people)     # 執行任務
        
        print("結束線程: " + self.name)

print("yoyo請小夥伴開始吃火鍋:!!!")

# 建立新線程
thread1 = myThread("xiaoming", "Thread-1")
thread2 = myThread("xiaowang", "Thread-2")

# 守護線程setDaemon(True)
thread1.setDaemon(True)       # 必須在start以前
thread2.setDaemon(True)

# 開啓線程
thread1.start()
thread2.start()

time.sleep(0.1)
print("退出主線程:吃火鍋結束,結帳走人")

4.運行結果:

阻塞主線程join(timeout)

1.若是想讓主線程等待子線程結束後再運行的話,就須要用到join(),此方法是在start以後(與setDaemon相反)

2.join(timeout)此方法有個timeout參數,是線程超時時間設置。

# coding=utf-8 import threading import time def chiHuoGuo(people): print("%s 吃火鍋的小夥伴-羊肉:%s" % (time.ctime(),people)) time.sleep(1) print("%s 吃火鍋的小夥伴-魚丸:%s" % (time.ctime(),people)) class myThread (threading.Thread): # 繼承父類threading.Thread def __init__(self, people, name): '''重寫threading.Thread初始化內容''' threading.Thread.__init__(self) self.threadName = name self.people = people def run(self): # 把要執行的代碼寫到run函數裏面 線程在建立後會直接運行run函數 '''重寫run方法''' print("開始線程: " + self.threadName) chiHuoGuo(self.people) # 執行任務  print("結束線程: " + self.name) print("yoyo請小夥伴開始吃火鍋:!!!") # 建立新線程 thread1 = myThread("xiaoming", "Thread-1") thread2 = myThread("xiaowang", "Thread-2") # 開啓線程 thread1.start() thread2.start() # 阻塞主線程,等子線程結束 thread1.join() thread2.join() time.sleep(0.1) print("退出主線程:吃火鍋結束,結帳走人")

運行結果:

 

相關文章
相關標籤/搜索