本文对不使用线程和使用线程做了一个对比。
假设有两件事情:听歌、看电影
一、不用线程
import time songs = ['爱情买卖','朋友','回家过年','好日子'] movies = ['阿凡达','猩球崛起'] def music(songs): for s in songs: print("开始听歌曲:%s \t-- %s" %(s, time.ctime())) time.sleep(3) def movie(movies): for m in movies: print("开始看电影:%s \t-- %s" %(m, time.ctime())) time.sleep(5) if __name__ == '__main__': # 直接 start = time.clock() music(songs) movie(movies) print("全部结束,耗时:{:.2f}".format(time.clock() - start))
运行效果图:
我们来计算一下时间:
歌曲:4 * 3 = 12 秒
电影:2 * 5 = 10 秒
合计: 22 秒 (方法:累加)
二、使用线程
开两个线程,一个听歌,一个看电影
import threading import time songs = ['爱情买卖','朋友','回家过年','好日子'] movies = ['阿凡达','猩球崛起'] def music(songs): for s in songs: print("开始听歌曲:%s \t-- %s" %(s, time.ctime())) time.sleep(3) def movie(movies): for m in movies: print("开始看电影:%s \t-- %s" %(m, time.ctime())) time.sleep(5) if __name__ == '__main__': start = time.clock() # 创建线程 t1 = threading.Thread(target=music, args=(songs,)) # 听歌 t2 = threading.Thread(target=movie, args=(movies,)) # 看电影 # 启动所有线程 for t in [t1, t2]: t.setDaemon(True) # 守护线程 t.start() #t.join() 不要这样 #t.join() 也不要这样 # 阻塞主线程,直到所有子线程退出 for t in [t1, t2]: t.join() print("全部线程结束,耗时:{:.2f}".format(time.clock() - start))
运行效果图:
我们来计算一下时间:
歌曲:4 * 3 = 12 秒
电影:2 * 5 = 10 秒
合计:12 秒(方法:取最大值)
三、如果没有 t.join(),则线程进入后台静默运行!
import threading import time songs = ['爱情买卖','朋友','回家过年','好日子'] movies = ['阿凡达','猩球崛起'] def music(songs): for s in songs: print("开始听歌曲:%s \t-- %s" %(s, time.ctime())) time.sleep(3) def movie(movies): for m in movies: print("开始看电影:%s \t-- %s" %(m, time.ctime())) time.sleep(5) if __name__ == '__main__': start = time.clock() # 创建线程 t1 = threading.Thread(target=music, args=(songs,)) t2 = threading.Thread(target=movie, args=(movies,)) # 启动所有线程 for t in [t1, t2]: t.setDaemon(True) # 守护线程 t.start() # 阻塞主线程,直到所有子线程退出,若没有,则进入后台静默运行 #for t in [t1, t2]: # t.join() print("全部线程结束,耗时:{:.2f}".format(time.clock() - start))
运行效果图: