定义方法:
from time import sleep,ctime
import threading
#音乐播放器
def music(func):
for i in range(2):
print(\'i was listening to %s %s\'%(func,ctime()))
sleep(2)
#视频播放器
def move(func):
for i in range(2):
print(\'i was at the movies %s %s\'%(func,ctime()))
sleep(5)
创建线程组:
# 创建线程组
threads=[]
# 创建线程t1
t1 = threading.Thread(target=music,args=(\'伤心1999\',))
threads.append(t1)
# 创建线程t2
t2 = threading.Thread(target=move,args=(\'巨齿鲨\',))
threads.append(t2)
启动线程:
if __name__ == \'__main__\':
#启动线程
for i in threads:
i.start()
#守护线程
for i in threads:
i.join()
print(\'all end: %s\'%ctime())
输出结果:
C:\Python35\python.exe E:/project/mutil.py
i was listening to 伤心1999 Fri Aug 17 15:16:32 2018
i was at the movies 巨齿鲨 Fri Aug 17 15:16:32 2018
i was listening to 伤心1999 Fri Aug 17 15:16:34 2018
i was at the movies 巨齿鲨 Fri Aug 17 15:16:37 2018
all end: Fri Aug 17 15:16:42 2018
Process finished with exit code 0
从结果上分析,我们可以看出:music和movie同时启动于16分32秒,直到所有线程结束于16:42秒。
总耗时为10秒。move的两次电影循环要10s,music的两次音乐循环要4s,从执行结果上看,两个线程真正达到了并行工作。
实例完整代码如下:
from time import sleep,ctime
import threading
#音乐播放器
def music(func):
for i in range(2):
print(\'i was listening to %s %s\'%(func,ctime()))
sleep(2)
#视频播放器
def move(func):
for i in range(2):
print(\'i was at the movies %s %s\'%(func,ctime()))
sleep(5)
# 创建线程组
threads=[]
# 创建线程t1
t1 = threading.Thread(target=music,args=(\'伤心1999\',))
threads.append(t1)
# 创建线程t2
t2 = threading.Thread(target=move,args=(\'巨齿鲨\',))
threads.append(t2)
if __name__ == \'__main__\':
print(\'start time: %s\'%ctime())
#启动线程
for i in threads:
i.start()
#守护线程
for i in threads:
i.join()
print(\'all end: %s\'%ctime())
接下来我们要改进一下我们线程的创建,因为在上面的例子中,我们没创建一个线程都要创建一个t1,t2,t3.....这样的话在导致创建线程较多时,非常的不方便。接下来我们改进一下下面的例子。
我们定义一个player方法,这个方法的作用是用来判断播放的类型,如果是mp3就执行music函数,如果是mp4就movie函数,这样做的好处是方便调用,更加灵活。
#判断文件类型,交给响应的函数处理
def player(name):
r = name.split(\'.\')[1]
if r == \'mp3\':
music(name)
elif r== \'mp4\':
move(name)
else:
print(\'error!输入有误,重新开始!\')
然后我们在创建一个线程:
list = [\'伤心1999.mp3\',\'巨齿鲨.mp4\']
threads=[]
#创建线程
for i in range(len(list)):
t = threading.Thread(target=player,args=(list[i],))
threads.append(t)
定义一个列表,里面存放的是播放的类型,后缀名都是以.mp3或者.mp4结尾的类型。使用for循环遍历整个list中的文件类型,然后循环添加到threads线程组中,这样做的好处是不需要一一定义单个线程,更加方便,简洁。
if __name__ == \'__main__\':
#启动线程
for i in range(len(list)):
threads[i].start()
#守护线程
for i in range(len(list)):
threads[i].join()
#主线程
print(\'end time: %s\'%ctime())
执行线程的入口函数,开启线程和守护线程,启动线程时,将threads列表中的单个线程循环开启,join函数是等待线程结束。输出结果如下:
C:\Python35\python.exe E:/project/mutil.py
i was listening to 伤心1999.mp3 Fri Aug 17 15:54:21 2018
i was at the movies 巨齿鲨.mp4 Fri Aug 17 15:54:21 2018
i was listening to 伤心1999.mp3 Fri Aug 17 15:54:23 2018
i was at the movies 巨齿鲨.mp4 Fri Aug 17 15:54:26 2018
end time: Fri Aug 17 15:54:31 2018
Process finished with exit code 0
完整代码如下:
#coding=utf-8 from time import sleep,ctime import threading #音乐播放器 def music(func): for i in range(2): print(\'i was listening to %s %s\'%(func,ctime())) sleep(2) #视频播放器 def move(func): for i in range(2): print(\'i was at the movies %s %s\'%(func,ctime())) sleep(5) #判断文件类型,交给响应的函数处理 def player(name): r = name.split(\'.\')[1] if r == \'mp3\': music(name) elif r== \'mp4\': move(name) else: print(\'error!输入有误,重新开始!\') list = [\'伤心1999.mp3\',\'巨齿鲨.mp4\'] threads=[] #创建线程 for i in range(len(list)): t = threading.Thread(target=player,args=(list[i],)) threads.append(t) if __name__ == \'__main__\': #启动线程 for i in range(len(list)): threads[i].start() #守护线程 for i in range(len(list)): threads[i].join() #主线程 print(\'end time: %s\'%ctime())