0
点赞
收藏
分享

微信扫一扫

优化线程的创建

从上面例子中发现线程的创建是颇为麻烦的,每创建一个线程都需要创建一个 t(t1、t2、...),如

果创建的线程较多时这样极其不方便。下面对通过例子进行改进:

player.py

#coding=utf-8

from time import sleep, ctime

import threading

def muisc(func):

for i in range(2):

print 'Start playing: %s! %s' %(func,ctime())

sleep(2)

def move(func):

for i in range(2):

print 'Start playing: %s! %s' %(func,ctime())

sleep(5)

#判断文件类型,交给相应的函数执行

def player(name):

r = name.split('.')[1]

if r == 'mp3':

muisc(name)

elif r == 'mp4':

move(name)

else:

print 'error: The format is not recognized!'

list = ['爱情买卖.mp3','阿凡达.mp4']

threads = []

files = range(len(list))

#创建线程

for i in files:

t = threading.Thread(target=player,args=(list[i],))

threads.append(t)

if __name__ == '__main__':

#启动线程

for i in files:

threads[i].start()

for i in files:

threads[i].join()

#主线程

print 'end:%s' %ctime()

有趣的是我们又创建了一个 player()函数,这个函数用于判断播放文件的类型。如果是 mp3 格式的,

我们将调用 music()函数,如果是 mp4 格式的我们调用 move()函数。哪果两种格式都不是那么只能告诉用

户你所提供有文件我播放不了。

然后,我们创建了一个 list 的文件列表,注意为文件加上后缀名。然后我们用 len(list) 来计算 list

列表有多少个文件,这是为了帮助我们确定循环次数。

接着我们通过一个 for 循环,把 list 中的文件添加到线程中数组 threads[]中。接着启动 threads[]

线程组,最后打印结束时间。

运行结果:

Python Shell

>>> ================================ RESTART ================================

>>>

Start playing: 爱情买卖.mp3! Sun Feb 15 10:49:42 2015

Start playing: 阿凡达.mp4! Sun Feb 15 10:49:42 2015

Start playing: 爱情买卖.mp3! Sun Feb 15 10:49:44 2015

Start playing: 阿凡达.mp4! Sun Feb 15 10:49:47 2015

end:Sun Feb 15 10:49:52 2015

现在向 list 数组中添加一个文件,程序运行时会自动为其创建一个线程。

通过上面的程序,我们发现player()用于判断文件扩展名,然后调用music()和move() ,其实,music()

和 move()完整工作是相同的,我们为什么不做一台超级播放器呢,不管什么文件都可以播放。再次经过改

造,我们的超级播放器诞生了。

super_player.py

#coding=utf-8

from time import sleep, ctime

import threading

#创建超级播放器

def super_player(file,time):

for i in range(2):

print 'Start playing: %s! %s' %(file,ctime())

sleep(time)

#播放的文件与播放时长

list = {'爱情买卖.mp3':3,'阿凡达.mp4':5,'我和你.mp3':4}

threads = []

files = range(len(list))

#创建线程

for file,time in list.items():

t = threading.Thread(target=super_player,args=(file,time))

threads.append(t)

if __name__ == '__main__':

#启动线程

for i in files:

threads[i].start()

for i in files:

threads[i].join()

#主线程

print 'end:%s' %ctime()

首先创建字典 list ,用于定义要播放的文件及时长(秒),通过字典的 items()方法来循环的取 file和 time,取到的这两个值用于创建线程。

接着创建 super_player()函数,用于接收 file 和 time,用于确定要播放的文件及时长。

最后是线程启动运行。运行结果:

Python Shell

>>> ================================ RESTART ================================

>>>

Start playing: 爱情买卖.mp3! Sun Feb 15 11:05:53 2015

Start playing: 我和你.mp3! Sun Feb 15 11:05:53 2015

Start playing: 阿凡达.mp4! Sun Feb 15 11:05:53 2015

Start playing: 爱情买卖.mp3! Sun Feb 15 11:05:56 2015

Start playing: 我和你.mp3! Sun Feb 15 11:05:57 2015

Start playing: 阿凡达.mp4! Sun Feb 15 11:05:58 2015

end:Sun Feb 15 11:06:03 2015

举报

相关推荐

0 条评论