• python多线程(一)


    ---恢复内容开始---

    首先先来看个单线程的例子:

    from time import ctime,sleep
    
    def music():
        for i in range(2):
            print("I was listening to music. %s" %ctime())
            sleep(1)
    
    def move():
        for i in range(2):
            print("I was at the movies! %s" %ctime())
            sleep(5)
    
    if __name__ == '__main__':
        music()
        move()
        print("all over %s" %ctime())

    首先先听了一首music,觉得音乐好听,就用for循环来控制音乐的播放了两次,每首音乐播放需要1秒钟,sleep()来控制音乐播放的时长,

    听说有部电影好看,我们就去看,每一场电影需要5秒钟,电影是在太好看了,我们有for循环2次运行结果如下:

    我正在听音乐. Sun May 20 12:15:52 2018
    我正在听音乐. Sun May 20 12:15:53 2018
    你正在看抖音! Sun May 20 12:15:54 2018
    你正在看抖音! Sun May 20 12:15:59 2018
    all over Sun May 20 12:16:04 2018
    [Finished in 12.2s]

    通过上边我们看到有两个方法,想到我们可不可以自定义听什么歌,看抖音什么类型的短视频

    于是对上面代码加以改造:

    from time import ctime,sleep

    def music(song):
    for i in range(2):
    print("我正在听%s音乐. %s" %(song,ctime()))
    sleep(1)

    def move(tv):
    for i in range(2):
    print("你正在看抖音%s短视频! %s" %(tv,ctime()))
    sleep(5)

    if __name__ == '__main__':
    music('纸短情长')
    move('吃鸡')
    print("all over %s" %ctime())

    看到了吧 我们加了个参数,运行结果:

    我正在听纸短情长音乐. Sun May 20 12:21:24 2018
    我正在听纸短情长音乐. Sun May 20 12:21:25 2018
    你正在看抖音吃鸡短视频! Sun May 20 12:21:26 2018
    你正在看抖音吃鸡短视频! Sun May 20 12:21:31 2018
    all over Sun May 20 12:21:36 2018
    [Finished in 12.2s]

    多线程:体现了一下单线程的使用,那么我们就来看看多线程到底有什么更加强大的功能

    from time import ctime, sleep
    import threading
    
    
    def music(song):
        for i in range(2):
            print("I was listening to %s. %s" % (song, ctime()))
            sleep(1)
    
    
    def move(mymove):
        for i in range(2):
            print("I was at the %s! %s" % (mymove, ctime()))
            sleep(5)
    
    threads = []
    th1 = threading.Thread(target=music, args=('一个人走',))
    threads.append(th1)
    th2 = threading.Thread(target=move, args=('复仇者联盟',))
    threads.append(th2)
    if __name__ == '__main__':
        for t in threads:
            t.setDaemon(True)  # setDaemon(True)将线程声明为
            # 守护线程,必须在start() 方法调用之前设置,如果
            # 不设置为守护线程程序会被无限挂起。子线程启动后,
            # 父线程也继续执行下去,当父线程执行完最后一条语句
            t.start()
        t.join()#程序加了个join()方法,用于等待线程
        # 终止。join()的作用是,在子线程完成运行之前,这个子线
        # 程的父线程将一直被阻塞。
        print("all over %s" % ctime())

    首先肯定是要导入threading模块:import threading

     

     

    threads = []
    th1 = threading.Thread(target=music, args=('一个人走',))
    threads.append(th1)

      创建了threads数组,创建线程th1,使用threading.Thread()方法,在这个方法中调用music方法target=music,args方法对music进行传参。 把创建好的线程t1装到threads数组中。

      接着以同样的方式创建线程th2,并把t2也装到threads数组。

    for t in threads:

      t.setDaemon(True)

      t.start()

    最后通过for循环遍历数组。(数组被装载了t1和t2两个线程)

     

    setDaemon()

      setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。子线程启动后,父线程也继续执行下去,当父线程执行完最后一条语句print "all over %s" %ctime()后,没有等待子线程,直接就退出了,同时子线程也一同结束。

     

    start()

    开始线程活动。

     运行结果:

    I was listening to 一个人走. Sun May 20 12:26:33 2018
    I was at the 复仇者联盟! Sun May 20 12:26:33 2018
    I was listening to 一个人走. Sun May 20 12:26:34 2018
    I was at the 复仇者联盟! Sun May 20 12:26:38 2018
    all over Sun May 20 12:26:43 2018
    [Finished in 10.3s]

    到这里,我们发现如果我有好多个线程,那岂不是我每个线程都要创建一个th~

    #!user/bin/env python
    # coding=utf-8
    
    from time import ctime, sleep
    import threading
    
    
    def music(song):
        for i in range(2):
            print("I was listening to %s. %s" % (song, ctime()))
            sleep(1)
    
    
    def move(mymove):
        for i in range(2):
            print("I was at the %s! %s" % (mymove, ctime()))
            sleep(5)
    
    
    def new_threading(name):
        new_thread = name.split('.')[1]
        if new_thread == 'mp3':
            music(name)
        else:
            if new_thread == 'mp4':
                move(name)
            else:
                print('error:The format is not recognized!')
    
    list = ['纸短情长.mp3', '复仇者联盟.mp4']
    threads = []
    file_count = range(len(list))
    # 创建线程
    for i in file_count:
        t = threading.Thread(target=new_threading, args=(list[i],))
        threads.append(t)
        # 启动线程
    if __name__ == '__main__':
        for t in file_count:
            threads[t].start()
        for t in file_count:
            threads[t].join()
        print("all over %s" % ctime())

    我们增加了一个增加线程的方法,只要想 list中添加一个文件,程序会自动为其创建线程

    I was listening to 纸短情长.mp3. Sun May 20 12:40:10 2018
    I was at the 复仇者联盟.mp4! Sun May 20 12:40:10 2018
    I was listening to 纸短情长.mp3. Sun May 20 12:40:11 2018
    I was at the 复仇者联盟.mp4! Sun May 20 12:40:15 2018
    all over Sun May 20 12:40:20 2018
    [Finished in 10.2s]

    是不是实现了 ,我们继续优化,发现new——threading中有个判断文件扩展名的,然后才调用music和move()

    那为什么不用一个方法(也就是一个软件)同时播放音乐和电影呢

    #!user/bin/env python
    # coding=utf-8
    
    from time import ctime, sleep
    import threading
    
    
    def super_player(file_type,time):
        for i in range(2):
            print("正在播放 %s. %s" % (file_type, ctime()))
            sleep(time)
    
    list ={'纸短情长.mp3':2, '复仇者联盟3.mp4':2,'人民的名义.wav':4}
    threads = []
    file_count = range(len(list))
    # 创建线程
    for file_type,time in list.items():
        t = threading.Thread(target=super_player, args=(file_type,time))
        threads.append(t)
        # 启动线程
    if __name__ == '__main__':
        for t in file_count:
            # [t].setDaemon(True)  # setDaemon(True)将线程声明为
            # 守护线程,必须在start() 方法调用之前设置,如果
            # 不设置为守护线程程序会被无限挂起。子线程启动后,
            # 父线程也继续执行下去,当父线程执行完最后一条语句
            threads[t].start()
        for t in file_count:
            threads[t].join()
        # t.join()#只对上面的程序加了个join()方法,用于等待线程
        # 终止。join()的作用是,在子线程完成运行之前,这个子线
        # 程的父线程将一直被阻塞。
        print("all over %s" % ctime())

    这里我们将list换成字典,定义播放的文件和时长,通过字典的items()方法来循环的取file和time,取到的这两个值用于创建线程。

    创建super_player()函数,用于接收file和time,用于确定要播放的文件及时长。运行结果如下:

    正在播放 纸短情长.mp3. Sun May 20 12:52:30 2018
    正在播放 复仇者联盟3.mp4. Sun May 20 12:52:30 2018
    正在播放 人民的名义.wav. Sun May 20 12:52:30 2018
    正在播放 纸短情长.mp3. Sun May 20 12:52:32 2018
    正在播放 复仇者联盟3.mp4. Sun May 20 12:52:32 2018
    正在播放 人民的名义.wav. Sun May 20 12:52:34 2018
    all over Sun May 20 12:52:38 2018
    [Finished in 8.2s]
    目前还在学习中,希望会对大家有所帮助,觉得不错,就点赞支持一下。 另外,转载时请附带链接。谢谢!
  • 相关阅读:
    C++并发与多线程学习笔记--unique_lock详解
    C++并发与多线程学习笔记--互斥量、用法、死锁概念
    MongoDB教程--配置与入门
    C++并发与多线程学习笔记--多线程数据共享问题
    C++并发与多线程学习笔记--参数传递详解
    C++并发与多线程学习笔记--基本概念和实现
    Python学习笔记--语音处理初步
    C#中三个关键字params,Ref,out
    Windows窗体应用开发3--配置标准控件1
    在博客的第一天
  • 原文地址:https://www.cnblogs.com/dangkai/p/9065903.html
Copyright © 2020-2023  润新知