Python中线程同步的实现

 更新时间:2025年06月17日 09:41:42   作者:菜逼の世界  
本文主要介绍了Python中线程同步的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

多线程

案例

说明:

  • 唱歌方法 sing()
  • 跳舞方法 dance()
  • 启用两个线程调用
  • 主线程结束

代码

# 导入线程模块
import threading
import time


def sing(name,age):
    time.sleep(2)
    print('唱歌者姓名:' + name + ',年龄:' + str(age))
    print('正在唱歌...')


def dance(name, age):
    time.sleep(2)
    print('跳舞者姓名:' + name + ',年龄:' + str(age))
    print('正在跳舞...')


if __name__ == '__main__':
    # args 元组传参
    t1 = threading.Thread(target=sing,args=('Alice', 18))
    # kwargs 对象传参
    t2 = threading.Thread(target=dance,kwargs={'name': 'Bob', 'age': 18})
    t1.start()
    t2.start()
    print("主线程结束")

  • 运行

在这里插入图片描述

问题现象

  • 输出的结果和代码的执行顺序不一致
  • 最后的主线程输出竟然最先输出
  • 线程的执行是异步的并非同步
  • 那么如何让线程同步执行呢?请看下一章节 《解决办法》

解决办法

线程同步

  • 线程等待
  • 互斥锁

线程等待

调用线程的等待方法: join()

  • 代码
# 导入线程模块
from threading import Thread
import time


def sing(name,age):
    time.sleep(2)
    print('唱歌者姓名:' + name + ',年龄:' + str(age))
    print('正在唱歌...')


def dance(name, age):
    time.sleep(2)
    print('跳舞者姓名:' + name + ',年龄:' + str(age))
    print('正在跳舞...')


if __name__ == '__main__':
    # args 元组传参
    t1 = Thread(target=sing,args=('Alice', 18))
    # kwargs 对象传参
    t2 = Thread(target=dance,kwargs={'name': 'Bob', 'age': 18})
    t1.start()
    t1.join()
    t2.start()
    t2.join()
    print("主线程结束")

  • 运行

在这里插入图片描述

互斥锁

步骤:

  • 导入锁模块:from threading import Lock
  • 实例化锁:lock = Lock()
  • 获取锁:lock.acquire()
  • 释放锁:lock.release()

代码

# 导入线程模块
from threading import Thread, Lock
import time


def sing(name, age):
    # 获取锁,用于线程同步
    lock.acquire()
    time.sleep(2)
    print('唱歌者姓名:' + name + ',年龄:' + str(age))
    print('正在唱歌...')
    # 释放锁,开启下一个线程
    lock.release()


def dance(name, age):
    # 获取锁,用于线程同步
    lock.acquire()
    time.sleep(2)
    print('跳舞者姓名:' + name + ',年龄:' + str(age))
    print('正在跳舞...')
    # 释放锁,开启下一个线程
    lock.release()


# 创建一个锁
lock = Lock()
if __name__ == '__main__':
    # args 元组传参
    t1 = Thread(target=sing, args=('Alice', 18))
    # kwargs 对象传参
    t2 = Thread(target=dance, kwargs={'name': 'Bob', 'age': 18})
    t1.start()
    # t1.join()
    t2.start()
    # t2.join()
    # print("主线程结束")

运行

在这里插入图片描述

到此这篇关于Python中线程同步的实现的文章就介绍到这了,更多相关Python 线程同步内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python 用turtle实现用正方形画圆的例子

    Python 用turtle实现用正方形画圆的例子

    今天小编就为大家分享一篇Python 用turtle实现用正方形画圆的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python列表list解析操作示例【整数操作、字符操作、矩阵操作】

    Python列表list解析操作示例【整数操作、字符操作、矩阵操作】

    这篇文章主要介绍了Python列表list解析操作,结合实例形式分析了Python列表针对整数、字符及矩阵的解析操作实现技巧,需要的朋友可以参考下
    2017-07-07
  • Python异步爬虫实现原理与知识总结

    Python异步爬虫实现原理与知识总结

    之前有很多小伙伴想看Python异步爬虫的有关知识总结,这次它来了,文中有非常详细的代码示例与注释,即使对刚开始学python的小伙伴也很友好,,需要的朋友可以参考下
    2021-05-05
  • python 爬取影视网站下载链接

    python 爬取影视网站下载链接

    一个简单的爬取影视网站下载链接的爬虫,非常适合新手学习,感兴趣的朋友可以参考下
    2021-05-05
  • Python中那些 Pythonic的写法详解

    Python中那些 Pythonic的写法详解

    这篇文章主要介绍了Python中那些 Pythonic的写法详解,一份优雅、干净、整洁的代码通常自带文档和注释属性,读代码即是读作者的思路,需要的朋友可以参考下
    2019-07-07
  • 使用Python3 poplib模块删除服务器多天前的邮件实现代码

    使用Python3 poplib模块删除服务器多天前的邮件实现代码

    这篇文章主要介绍了使用Python3 poplib模块删除多天前的邮件的实现代码,代码简单易懂,非常不错,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 最好的Python DateTime 库之 Pendulum 长篇解析

    最好的Python DateTime 库之 Pendulum 长篇解析

    datetime 模块是 Python 中最重要的内置模块之一,它为实际编程问题提供许多开箱即用的解决方案,非常灵活和强大。例如,timedelta 是我最喜欢的工具之一
    2021-11-11
  • pyhton列表转换为数组的实例

    pyhton列表转换为数组的实例

    下面小编就为大家分享一篇pyhton列表转换为数组的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python实现的文件同步服务器实例

    python实现的文件同步服务器实例

    这篇文章主要介绍了python实现的文件同步服务器,实例分析了文件同步服务器的原理及客户端、服务端的实现技巧,需要的朋友可以参考下
    2015-06-06
  • Python OpenCV实现图像傅里叶变换

    Python OpenCV实现图像傅里叶变换

    傅里叶变换,也称作傅立叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。本文将介绍如何通过OpenCV实现图像的傅里叶变换,需要的可以参考一下
    2022-01-01

最新评论