python多线程技术(二)

定义方法:
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())

将喜欢的一切留在身边,这便是努力的意义。

浙公网安备 33010602011771号