从上面例子中发现线程的创建是颇为麻烦的,每创建一个线程都需要创建一个 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