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())

posted @ 2018-08-17 16:03  IT测试老兵  阅读(246)  评论(0)    收藏  举报
作者:测试老兵
出处:https://www.cnblogs.com/fighter007/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。