1. 程式人生 > >python多執行緒的幾種情形分析-三種情況

python多執行緒的幾種情形分析-三種情況

情形一:預設情況

  預設情況,只開啟執行緒,那麼,主執行緒結束,其他子執行緒可能還沒結束。

  只使用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的錯誤用法,新手請注意