情形一:默认情况
默认情况,只开启线程,那么,主线程结束,其他子线程可能还没结束。
只使用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)
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)
注意:例子二给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阻塞,使得“多线程”失去了多线程意义。