Python多线程

来源:互联网 发布:安卓手机优化软件 知乎 编辑:程序博客网 时间:2024/06/08 02:20

父线程的时间是子线程时间最多的和,子线程时间少的相当于不加入总耗时,下面请体会。

# coding=utf-8import threadingfrom time import ctime, sleepdef 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 2017I was at the 阿凡达! Thu Jun  8 16:21:55 2017all over Thu Jun  8 16:21:55 2017Process 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 2017I was at the 阿凡达! Thu Jun  8 16:23:42 2017I was listening to 爱情买卖. Thu Jun  8 16:23:43 2017I was at the 阿凡达! Thu Jun  8 16:23:47 2017all over Thu Jun  8 16:23:52 2017Process 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 2017I was at the 阿凡达! Thu Jun  8 16:30:35 2017I was listening to 爱情买卖. Thu Jun  8 16:30:39 2017I was at the 阿凡达! Thu Jun  8 16:30:40 2017all over Thu Jun  8 16:30:45 2017Process finished with exit code 0

总耗时为10秒,总的时间没变化,但是比单线程的节约8秒。现在应该对本文最开始的说明有了理解了吧。