fighter007

定义方法:

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

分类:

技术点:

相关文章: