Python多线程

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

# 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秒。现在应该对本文最开始的说明有了理解了吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值