********************** 创建一个播放器的线程 **********************
from timeimport sleep,ctime
import threading
#创建听音乐任务
def music(func):
for iin range(2):
print("我正在听:%s! %s"%(func,ctime()))
sleep(2)
#创建看电影任务
def move(func):
for i in range(2):
print("我正在查看:%s! %s"%(func,ctime()))
sleep(5)
#判断文件类型,交给相应的函数执行
def palyer(name):
r = name.split(".")[1]
if r =="mp3":
music(name)
elif r =="mp4":
move(name)
else:
print("格式错误,无法播放!")
list = ["大中国.mp3","战狼2.mp4"]
#创建线程列表
threads = []
#创建线程t1,并添加到线程列表
t1 = threading.Thread(target=music,args=("大中国",))
threads.append(t1)
#创建线程t2,并添加到线程列表
t2 = threading.Thread(target=move,args=("战狼2",))
threads.append(t2)
if __name__ =="__main__":
#启动线程
for iin threads:
i.start()
#守护线程
for iin threads:
i.join()
#主线程
print("all end:",ctime())
************************ 线程的优化 **************************************
从上面例子中发现线程的创建是颇为麻烦的,每创建一个线程都需要创建一个t(t1、t2、...),如
果创建的线程较多时这样极其不方便。下面对通过例子进行改进:
import threading
from timeimport sleep,ctime
#播放音乐
def music(func):
for iin range(0,2):
print("我正在听:",func,ctime())
sleep(2)
#播放视频
def move(func):
for iin range(0,2):
print("我正在看:",func,ctime())
sleep(5)
#播放器
def player(file):
hz = file.split(".")[1]
if hz =="mp3":
music(file)
elif hz =="mp4":
move(file)
else:
print("文件格式错误!")
#定义播放列表
lst = ["大中国.mp3","战狼2.mp4"]
#创建空线程
threads = []
#创建线程
for filein lst:
threads.append(threading.Thread(target=player,args=(file,)))
#启动线程
for iin threads:
i.start()
#创建守护线程
for iin threads:
i.join()
print("主线程结束")
注释:
我们创建了一个player()函数,这个函数用于判断播放文件的类型。如果是mp3 格式的,我们将调用music()函数,如果是mp4格式的我们调用move()函数。哪果两种格式都不是那么只能告诉用户你所提供有文件我播放不了。
之后,我们创建了一个lst 的文件列表,注意为播放的文件要加上后缀名。然后我们用file 来遍历文件列表中的所有内容。
接着我们通过一个for 循环,把list 中的文件添加到线程中数组threads[]中。接着启动threads[]线程组,最后打印结束时间。
************************************* 继续改进 *********************************
通过上面的程序,我们发现player()用于判断文件扩展名,然后调用music()和move() 。有没有办法创建一台超级播放器,什么文件都可以播放呢?答案是肯定的,接下来,我们继续改进:
from timeimport sleep,ctime
import threading
import time
#创建超级播放器
def super_player(func,time):
for iin range(0,2):
print("正在播放%s %s"%(func,ctime()))
sleep(time)
#定义播放列表
dict1 = {"中华民谣.mp3":3,"大中国.mp3":4,"战狼2.mp4":2}
#定义线程列表
threads = []
#创建播放线程
for file,timein dict1.items():
t = threading.Thread(target=super_player,args=(file,time))
threads.append(t)
if __name__ =="__main__":
#启动线程,同时启动守护线程
for iin threads:
i.start()
for iin threads:
i.join()
#主线程
print("主线程结束 %s"%ctime())
注释:
首先创建字典list ,用于定义要播放的文件及时长(秒),通过字典的items()方法来循环的取file和time,取到的这两个值用于创建线程。接着创建super_player()函数,用于接收file 和time,用于确定要播放的文件及时长。
********************************** 用线程类的方法完成上面的编程 ***********************
import threading
from timeimport sleep,ctime
class MyThread(threading.Thread):
def __init__(self,file,time):
#固定写法,必须显示调用父类的构造函数
threading.Thread.__init__(self)
self.file=file
self.time=time
#run()函数,是固定的写法,表示运行线程的内容
def run(self):
super_play(self.file,self.time)
#被线程调用来执行的方法
def super_play(file,time):
for iin range(2):
print('正在播放: %s! %s' %(file,ctime()))
sleep(time)
#定义播放列表
lst = {"中华民谣.mp3":3,"大中国.mp3":4,"战狼2.mp4":2}
#创建线程
threads = []
#创建播放器线程
for file,timein lst.items():
t = MyThread(file,time)
threads.append(t)
if __name__ =='__main__':
#启动线程
for iin threads:
i.start()
#创建守护线程
for iin threads:
i.join()
#主线程
print('主线程结束:%s' %ctime())