page contents

实例讲解Python多线程的使用

本文讲述了实例讲解python 多线程的使用!具有很好的参考价值,希望对大家有所帮助。一起跟随好学星城小编过来看看吧,具体如下:

attachments-2024-01-KSzUJ0O465b865d17fdf0.jpg

本文讲述了实例讲解python 多线程的使用!具有很好的参考价值,希望对大家有所帮助。一起跟随好学星城小编过来看看吧,具体如下:

我们知道进程是资源分配的单位,线程是处理机调度的单位。下文就以简明的例子带大家理解线程,并使用Python实现多线程。

比如在飞车程序中,我们在玩游戏的同时,还可以听到游戏为我们配置的背景音乐。在这个例子中启动飞车程序就是一个进程,玩游戏和听音乐是两个线程。

单线程

在最早的计算机中,操作系统处理问题是单任务的,要玩游戏和听音乐,就一定要顺序进行,不能并发。我们假设玩游戏需要3秒,听音乐需要1秒。

def music(music_name):

    for i in range(2):

        print('正在听{}'.format(music_name))

        sleep(1)

        print('music over')


def game(game_name):

    for i in range(2):

        print('正在玩{}'.format(game_name))

        sleep(3)

        print('game over')


if __name__ == '__main__':

    music('稻香')

    game('飞车')

    print('主线程结束')

我先听了一首《稻香》,通过for循环控制音乐播放两次,每首音乐播放需要1秒,sleep()来控制音乐播放的时长,接着又玩了两把飞车,最后关闭了程序。


----输出----

正在听稻香

music over

正在听稻香

music over

正在玩飞车

game over

正在玩飞车

game over

主线程结束

多线程


随着技术的不断进步,操作系统就进入了多任务时代。在单核架构中的多线程是以极短的时间间隔交替执行任务,让人感觉它们在同时执行一样。以“吃着火锅唱着歌”举例,若是单线程则是先吃火锅,直到吃完后再唱歌,但是多线程的话我们可以吃一口唱一句,达到“吃着火锅唱着歌”的效果。

Python提供了threading模块来实现多线程 。我们对上面的例子进行改造,实现在听音乐的同时玩飞车。在此之前先为大家介绍一下线程的相关概念。

主线程:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread)。因为它是程序开始时就执行的,如果你需要再创建线程,那么创建的线程就是这个主线程的子线程。

子线程:使用threading、ThreadPoolExecutor创建的线性均为子线程。

主线程的重要性体现在两方面:1.是产生其他子线程的线程;2.通常它必须最后完成执行,比如执行各种关闭动作。

from time import sleep

import threading


def music(music_name):

    for i in range(2):

        print('正在听{}'.format(music_name))

        sleep(1)

        print('music over')


def game(game_name):

    for i in range(2):

        print('正在玩{}'.format(game_name))

        sleep(3)

        print('game over')


threads = []

t1 = threading.Thread(target=music,args=('稻香',))

threads.append(t1)

t2 = threading.Thread(target=game,args=('飞车',))

threads.append(t2)


if __name__ == '__main__':

    for t in threads:

        t.setDaemon(True)

        t.start()

    print('主线程运行结束')

首先导入模块,使用threading.Thread()方法创建线程,然后在这个方法中使用target指定music任务,args方法对music进行传参,将听歌线程定义为t1,接着以同样的方式创建线程t2,并将他们一起放到threads列表中。

然后通过for遍历threads,start()方法为启动线程的命令。setDaemon(True)将线程声明为守护主线程,作用是子线程启动后,主线程也继续执行下去,当主线程执行完'主线程运行结束'后,它不会等待子线程运行结束,而是自己直接结束,同时子线程也一同结束。

----输出----

正在听稻香

正在玩飞车

主线程运行结

我们可以看到这并不符合我们的要求,子线程(muisc 、game )和主线程(print('主线程运行结束'))都是同一时间启动,但由于主线程执行完结束,所以导致子线程也终止。所以我们使用join()方法,守护子线程。


from time import sleep

import threading


def music(music_name):

    for i in range(2):

        print('正在听{}'.format(music_name))

        sleep(1)

        print('music over')


def game(game_name):

    for i in range(2):

        print('正在玩{}'.format(game_name))

        sleep(3)

        print('game over')


threads = []

t1 = threading.Thread(target=music,args=('稻香',))

threads.append(t1)

t2 = threading.Thread(target=game,args=('飞车',))

threads.append(t2)


if __name__ == '__main__':

    for t in threads:

        t.start()


    for t in threads:

        t.join()

    print('主线程运行结束')

join()的作用是在该子线程完成运行之前,主线程将一直被阻塞。


----输出----

正在听稻香

正在玩飞车

music over

正在听稻香

music over

game over

正在玩飞车

game over

主线程运行结束

如果不使用setDaemon与join,那么最后的结果是主线程与子线程同时运行,直到所有线程都运行结束,程序才会结束。


----不使用setDaemon与join的输出----

正在听稻香

正在玩飞车

主线程运行结束

music over

正在听稻香

music over

game over

正在玩飞车

game over

以上就是Python使用多线程的基本框架,你学会了吗?

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2024-01-30 10:58
  • 阅读 ( 183 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章