********************** ?創(chuàng)建一個播放器的線程 ?**********************
from timeimport sleep,ctime
import threading
#創(chuàng)建聽音樂任務
def music(func):
for iin range(2):
print("我正在聽:%s! %s"%(func,ctime()))
sleep(2)
#創(chuàng)建看電影任務
def move(func):
for i in range(2):
print("我正在查看:%s! %s"%(func,ctime()))
sleep(5)
#判斷文件類型贮聂,交給相應的函數執(zhí)行
def palyer(name):
r = name.split(".")[1]
if r =="mp3":
music(name)
elif r =="mp4":
move(name)
else:
print("格式錯誤荠瘪,無法播放!")
list = ["大中國.mp3","戰(zhàn)狼2.mp4"]
#創(chuàng)建線程列表
threads = []
#創(chuàng)建線程t1,并添加到線程列表
t1 = threading.Thread(target=music,args=("大中國",))
threads.append(t1)
#創(chuàng)建線程t2,并添加到線程列表
t2 = threading.Thread(target=move,args=("戰(zhàn)狼2",))
threads.append(t2)
if __name__ =="__main__":
#啟動線程
? ? for iin threads:
i.start()
#守護線程
? ? for iin threads:
i.join()
#主線程
print("all end:",ctime())
************************ ?線程的優(yōu)化 ?**************************************
從上面例子中發(fā)現線程的創(chuàng)建是頗為麻煩的无拗,每創(chuàng)建一個線程都需要創(chuàng)建一個t(t1、t2、...)侧蘸,如
果創(chuàng)建的線程較多時這樣極其不方便钦幔。下面對通過例子進行改進:
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","戰(zhàn)狼2.mp4"]
#創(chuàng)建空線程
threads = []
#創(chuàng)建線程
for filein lst:
threads.append(threading.Thread(target=player,args=(file,)))
#啟動線程
for iin threads:
i.start()
#創(chuàng)建守護線程
for iin threads:
i.join()
print("主線程結束")
注釋:
? ? 我們創(chuàng)建了一個player()函數杨耙,這個函數用于判斷播放文件的類型。如果是mp3 格式的飘痛,我們將調用music()函數珊膜,如果是mp4格式的我們調用move()函數。哪果兩種格式都不是那么只能告訴用戶你所提供有文件我播放不了宣脉。
?? ?之后车柠,我們創(chuàng)建了一個lst 的文件列表,注意為播放的文件要加上后綴名塑猖。然后我們用file 來遍歷文件列表中的所有內容竹祷。
? ? 接著我們通過一個for 循環(huán),把list 中的文件添加到線程中數組threads[]中羊苟。接著啟動threads[]線程組塑陵,最后打印結束時間。
************************************* ?繼續(xù)改進 ?*********************************
通過上面的程序蜡励,我們發(fā)現player()用于判斷文件擴展名令花,然后調用music()和move() 。有沒有辦法創(chuàng)建一臺超級播放器凉倚,什么文件都可以播放呢兼都?答案是肯定的,接下來稽寒,我們繼續(xù)改進:
from timeimport sleep,ctime
import threading
import time
#創(chuàng)建超級播放器
def super_player(func,time):
for iin range(0,2):
print("正在播放%s %s"%(func,ctime()))
sleep(time)
#定義播放列表
dict1 = {"中華民謠.mp3":3,"大中國.mp3":4,"戰(zhàn)狼2.mp4":2}
#定義線程列表
threads = []
#創(chuàng)建播放線程
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())
注釋:
首先創(chuàng)建字典list 俯抖,用于定義要播放的文件及時長(秒),通過字典的items()方法來循環(huán)的取file和time瓦胎,取到的這兩個值用于創(chuàng)建線程芬萍。接著創(chuàng)建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)
#被線程調用來執(zhí)行的方法
def super_play(file,time):
for iin range(2):
print('正在播放: %s! %s' %(file,ctime()))
sleep(time)
#定義播放列表
lst = {"中華民謠.mp3":3,"大中國.mp3":4,"戰(zhàn)狼2.mp4":2}
#創(chuàng)建線程
threads = []
#創(chuàng)建播放器線程
for file,timein lst.items():
t = MyThread(file,time)
threads.append(t)
if __name__ =='__main__':
#啟動線程
? ? for iin threads:
i.start()
#創(chuàng)建守護線程
? ? for iin threads:
i.join()
#主線程
? ? print('主線程結束:%s' %ctime())