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代码去掉文本中的各种符号

    数据清洗之如何用一行Python代码去掉文本中的各种符号

    我们在处理文本的时候往往需要对标点符号进行处理,下面这篇文章主要给大家介绍了关于数据清洗之如何用一行Python代码去掉文本中的各种符号的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • python datatable库大型数据集和多核数据处理使用探索

    python datatable库大型数据集和多核数据处理使用探索

    这篇文章主要介绍了python datatable库大型数据集和多核数据处理使用探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • TensorFlow基本的常量、变量和运算操作详解

    TensorFlow基本的常量、变量和运算操作详解

    今天小编就为大家分享一篇TensorFlow基本的常量、变量和运算操作详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 如何使用Python和OpenCV进行实时目标检测实例详解

    如何使用Python和OpenCV进行实时目标检测实例详解

    这篇文章介绍了一个使用Python和OpenCV实现实时视频流目标检测的程序,程序使用预训练的YOLOv3模型,并通过多线程处理提高性能,代码展示了如何导入库、初始化参数、加载模型、处理视频帧以及显示结果,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • python爬虫之request模块深入讲解

    python爬虫之request模块深入讲解

    requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多,下面这篇文章主要给大家介绍了关于python爬虫之request模块的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Python实现轻松防止屏幕截图的技巧分享

    Python实现轻松防止屏幕截图的技巧分享

    屏幕截图是一种常见的用于记录信息或者监控用户活动的方法,为了保护隐私和数据安全,可以通过使用Python编写一些防护措施来防止他人截取我们的屏幕,下面我们就来学习一下有哪些具体操作吧
    2023-12-12
  • 关于Python的文本文件转换编码问题

    关于Python的文本文件转换编码问题

    这篇文章主要介绍了关于Python的文本文件转换编码问题,编程过程中,经成会遇到字符编码的问题,需要的朋友可以参考下
    2023-04-04
  • 解决Python 进程池Pool中一些坑

    解决Python 进程池Pool中一些坑

    这篇文章主要介绍了解决Python 进程池Pool中一些坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 简单介绍Python的Django框架加载模版的方式

    简单介绍Python的Django框架加载模版的方式

    这篇文章主要介绍了Python的Django框架加载模版的方式,包括一些对加载顺序的介绍,需要的朋友可以参考下
    2015-07-07
  • Python实现二分查找与bisect模块详解

    Python实现二分查找与bisect模块详解

    二分查找又叫折半查找,二分查找应该属于减治技术的成功应用。python标准库中还有一个灰常给力的模块,那就是bisect。这个库接受有序的序列,内部实现就是二分。下面这篇文章就详细介绍了Python如何实现二分查找与bisect模块,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01

最新评论