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的错误用法,新手请注意
原文地址:https://www.cnblogs.com/hardykay/p/10203175.html