父线程的时间是子线程时间最多的和,子线程时间少的相当于不加入总耗时,下面请体会。
# coding=utf-8
import threading
from time import ctime, sleep
def music(func):
for i in range(2):
print "I was listening to %s. %s" % (func, ctime())
sleep(1)
def movie(func):
for i in range(2):
print "I was at the %s! %s" % (func, ctime())
sleep(5)
threads = []
t1 = threading.Thread(target=music, args=(u'爱情买卖',))
threads.append(t1)
t2 = threading.Thread(target=movie, args=(u'阿凡达',))
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.setDaemon(True)
t.start()
print "all over %s" % ctime()
import threading
首先导入threading 模块,这是使用多线程的前提。
threads = []
t1 = threading.Thread(target=music,args=(u’爱情买卖’,))
threads.append(t1)
创建了threads数组,创建线程t1,使用threading.Thread()方法,在这个方法中调用music方法target=music,args方法对music进行传参。 把创建好的线程t1装到threads数组中。
接着以同样的方式创建线程t2,并把t2也装到threads数组。
for t in threads:
t.setDaemon(True)
t.start()
最后通过for循环遍历数组。(数组被装载了t1和t2两个线程)
setDaemon()
setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print “all over %s” %ctime()后,没有等待子线程,直接就退出了,同时子线程也一同结束。
start()
开始线程活动。
运行结果:
I was listening to 爱情买卖. Thu Jun 8 16:21:55 2017
I was at the 阿凡达! Thu Jun 8 16:21:55 2017
all over Thu Jun 8 16:21:55 2017
Process finished with exit code 0
总耗时0秒。
子线程(muisc 、movie )和主线程(print “all over %s” %ctime())都是同一时间启动,但由于主线程执行完结束,所以导致子线程也终止。
调整程序:
...
if __name__ == '__main__':
for t in threads:
t.setDaemon(True)
t.start()
t.join()
print "all over %s" %ctime()
我们只对上面的程序加了个join()方法,用于等待线程终止。join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
注意: join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。
运行结果:
I was listening to 爱情买卖. Thu Jun 8 16:23:42 2017
I was at the 阿凡达! Thu Jun 8 16:23:42 2017
I was listening to 爱情买卖. Thu Jun 8 16:23:43 2017
I was at the 阿凡达! Thu Jun 8 16:23:47 2017
all over Thu Jun 8 16:23:52 2017
Process finished with exit code 0
耗时:10秒,相当于两个movie时间
如果是单线程的话总耗时应该是1s+5s+1s+5s=12s,多线程节省时间2秒。
如果我们把music的耗时调整为4s,单线程总耗时应该是4s+5s+4s+5s=18s,下面我们看看多线程耗时:
...
def music(func):
for i in range(2):
print "I was listening to %s. %s" %(func,ctime())
sleep(4)
...
结果为:
I was listening to 爱情买卖. Thu Jun 8 16:30:35 2017
I was at the 阿凡达! Thu Jun 8 16:30:35 2017
I was listening to 爱情买卖. Thu Jun 8 16:30:39 2017
I was at the 阿凡达! Thu Jun 8 16:30:40 2017
all over Thu Jun 8 16:30:45 2017
Process finished with exit code 0
总耗时为10秒,总的时间没变化,但是比单线程的节约8秒。现在应该对本文最开始的说明有了理解了吧。