python多執行緒的幾種情形分析-三種情況
阿新 • • 發佈:2018-12-31
情形一:預設情況
預設情況,只開啟執行緒,那麼,主執行緒結束,其他子執行緒可能還沒結束。
只使用t=threading.Thead(target=fun),t.start()。
import threading import time def run(): time.sleep(2) print('當前執行緒的名字是: ', threading.current_thread().name) time.sleep(2) if __name__ == '__main__': start_time = time.time()print('這是主執行緒:', threading.current_thread().name) thread_list = [] for i in range(5): t = threading.Thread(target=run) thread_list.append(t) for t in thread_list: t.start() print('主執行緒結束!' , threading.current_thread().name) print('一共用時:', time.time()-start_time)
情形二:守護執行緒(後臺執行緒)
含義:主執行緒一結束,其他守護執行緒跟著一起結束。
比情形一多了一個t.setDaemon(True),預設情況下是False(前臺執行緒),注意,setDaemon(True)必須在start()前面。
import threading import time def run(): time.sleep(2) print('當前執行緒的名字是: ', threading.current_thread().name) time.sleep(例子2) if __name__ == '__main__': start_time = time.time() print('這是主執行緒:', threading.current_thread().name) thread_list = [] for i in range(5): t = threading.Thread(target=run) thread_list.append(t) for t in thread_list: t.setDaemon(True) t.start() print('主執行緒結束了!' , threading.current_thread().name) print('一共用時:', time.time()-start_time)
情形三:執行緒同步join
含義:主執行緒結束,但需要等待其他子執行緒的執行,下面的例子,跟沒有使用執行緒沒有區別,順序執行,必須等待第一個join執行完成才能執行下一個。
與setDaemon相反的是join要寫在start()之後,當然,功能也跟setDeamon相反。
import threading import time def run(): time.sleep(2) print('當前執行緒的名字是: ', threading.current_thread().name) time.sleep(2) if __name__ == '__main__': start_time = time.time() print('這是主執行緒:', threading.current_thread().name) thread_list = [] for i in range(5): t = threading.Thread(target=run) thread_list.append(t) for t in thread_list: t.setDaemon(True) t.start() for t in thread_list: t.join() print('主執行緒結束了!' , threading.current_thread().name) print('一共用時:', time.time()-start_time)例子1
import threading import time def run(): time.sleep(2) print('當前執行緒的名字是: ', threading.current_thread().name) time.sleep(2) if __name__ == '__main__': start_time = time.time() print('這是主執行緒:', threading.current_thread().name) thread_list = [] for i in range(5): t = threading.Thread(target=run) thread_list.append(t) for t in thread_list: t.setDaemon(True) t.start() for t in thread_list: t.join(0.2) print('主執行緒結束了!' , threading.current_thread().name) print('一共用時:', time.time()-start_time)例子2
注意:例子二給join傳一個0.2的值,那麼子程式一共執行1秒鐘。可以看到,子執行緒沒完全執行完畢,如果將這個值設定成0.4或者0.5又會如何,大家自己試一試。
import threading import time def action(arg): time.sleep(1) print 'sub thread start!the thread name is:%s ' % threading.currentThread().getName() print 'the arg is:%s ' %arg time.sleep(1) for i in range(4): t =threading.Thread(target=action,args=(i,)) t.setDaemon(True) t.start() t.join() 這樣對的程式只能順序執行,每個執行緒都被上一個執行緒的join阻塞,使得“多執行緒”失去了多執行緒意義。join的錯誤用法,新手請注意