返回顶部
首页 > 资讯 > 后端开发 > Python >简单探讨一下python线程锁
  • 882
分享到

简单探讨一下python线程锁

python线程锁 2023-05-17 08:05:42 882人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录为什么需要线程锁线程锁使用案例说明线程锁实现一个读写锁总结为什么需要线程锁 当我们访问一些特殊的数据时,需要保证该数据的原子性,比如: 文章的阅读量、文章的点赞量等。我们必须要确

为什么需要线程锁

当我们访问一些特殊的数据时,需要保证该数据的原子性,比如: 文章的阅读量、文章的点赞量等。我们必须要确保这些共享数据必须是原子性的,否则的话,多线程同时访问的时候,可能会出现异常情况,什么是原子性呢?原子性是指一个操作是不可能被中途中断的,要不全部完成,要不没有完成,这么说,可能不理解,下面举个例子来说明一下原子性的重要性:

比如我们写一个程序,来模拟10个人点赞,最后输出阅读量的值,代码如下:

代码初看好像没什么问题,反正核心点就是阅读量+1,当运行就,就出现问题了,

上述代码,运行了5次,出现了5次不一样的结果。这就是出现了竞争,所以我们需要加一个锁,来确保该阅读量函数的原子性。

线程锁使用

python中的threading模块,提供的锁就只有一种,我们使用Lock定义锁,例如:

Lock = threading.Lock()

如果需要对资源进行上锁的话,使用acquire方法即可,例如:

Lock.acquire()

如果需要对资源进行解锁的话,使用release方法即可,例如:

Lock.release()

除此之外,threading模块还提供了RLock可重入锁,可重入锁的作用和普通锁一样,用于保护资源,以保证并发访问不会出现问题,但是与普通锁不同的是,可重入锁允许同一个线程在持有锁的情况下多次获取该锁而不会发生死锁。但是在持有多少次锁,也必须释放多少次锁,否则会出现问题。

案例说明线程锁

上述我们介绍了线程锁,这里将addReaderCount进行加锁和解锁的操作,代码如下:

上述代码在源代码的基础上,在最开始使用Lock定义了一个锁,而后再函数开始之前进行一个加锁acquire(),这样的话,其他函数在执行的时候,发现这个是已经锁住了的,所以会等待,等待解锁后(releas())再进行该函数,而函数又会加锁,如此往复,能够确保在同一时刻,addReaderCount函数只执行一次。

执行程序结果为:

可以发现,这次的结果阅读量的值终于符合我们的预期了。

实现一个读写锁

Python中,原生是没有读写锁的,只能借助第三方来实现,这里我们可以实现一个简单的读写锁。

在写之前,我们需要先了解下读写锁的作用到底是什么?读写锁将资源拆分为读和写2种操作,读锁允许多个线程同时读取共享资源,提高并发性能。但是当需要修改共享资源的时候,只能允许一个线程修改该共享资源,并且在修改完毕前,不允许读请求,以便造成数据不一致。所以操作完毕后,开放读请求。

这里为了实验,写了一个最简单的读写锁,安全性和效率都得不到保证,若想使用读写锁,可以使用第三方的读写锁。

我们自己写的读写锁代码如下:

上述代码,我们实现了一个读写锁类RWLock,其中有4个方法,分别为:

  • writeLock:写锁
  • writeUnlock:释放写锁
  • readLock:读锁
  • readUnlock: 释放读锁

由于读锁可以同一时刻被调用,所以我们使用的变量readCount来定义的,等需要读锁的是,readCount会+1,可以一直调用下去,而如果需要写锁的时候,这里是先将写锁变量Locked定义为True,若此时再次调用读写,会让其等待,而在写锁中,会等待读锁读取完毕后(readCount为0的时候),再进行写锁的请求。写锁执行完毕后,会将Locked给重置为False

这里写一个小的调用方法来调用一下:

上述代码,在readswrites方法中,分表调用我们之前定义的读锁和写锁,代码中定义了9个线程,分别是调用了6次读,以及3次写。

效果我们来看下:

从上述结果中,我们不难发现,在没有写锁情况下,我们使用读锁,可以访问同一资源,当使用写锁后,读锁会暂停,当写锁执行完毕后,读锁才会继续批量执行。

总结

本篇文章简单探讨了一下python线程锁,并且举了一个点赞的案例,来说明某些资源/函数需要原子性操作的时候,为避免资源竞争,所以需要在使用过程中,增加一个锁,以保证其原子性,由于python原生没有读写锁,需要依赖于第三方,所以最后我们写了一个最简单的读写锁。

到此这篇关于简单探讨一下python线程锁的文章就介绍到这了,更多相关python 线程锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 简单探讨一下python线程锁

本文链接: https://lsjlt.com/news/210886.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 简单探讨一下python线程锁
    目录为什么需要线程锁线程锁使用案例说明线程锁实现一个读写锁总结为什么需要线程锁 当我们访问一些特殊的数据时,需要保证该数据的原子性,比如: 文章的阅读量、文章的点赞量等。我们必须要确...
    99+
    2023-05-17
    python 线程锁
  • 浅谈一下python线程池简单应用
    一、线程池简介 传统多线程方案会使用“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务时执行时间较短,而...
    99+
    2023-05-16
    python线程池 python线程池应用
  • 探讨:单线程在Go语言中的应用
    单线程是一种执行模型,它与多线程相对应。在Go语言中,单线程的应用非常广泛,尤其适用于一些简单的并发操作和任务处理。本文将探讨单线程在Go语言中的应用和具体的代码示例。 首先,需要明确...
    99+
    2024-04-02
  • 深入探讨:Go语言中的单线程特性
    Go语言作为一种现代化的编程语言,以其简洁高效的特性在近年来受到越来越多开发者的喜爱和青睐。其中一个让人独特的地方就是其单线程特性。在传统的多线程编程语言中,开发者通常需要手动管理线程...
    99+
    2024-03-15
    go语言 探讨 单线程
  • 用Python实现一个简单的线程池
    线程池的概念是什么?在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能...
    99+
    2023-01-31
    线程 简单 Python
  • python 多线程简单实现
    1. 线程是什么?线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。2 为什么要用线程?a 单个线程可以在进程中独立运行c 并行操作,适用于C/S架构3 python怎么生成线程(将函数生...
    99+
    2023-01-31
    多线程 简单 python
  • 简单的python多线程并发
    前些天学到的线程,做下记录,以备后用: 程序如下: import sys,time import thread def a():        for i in range(1,5):      ...
    99+
    2023-01-31
    多线程 简单 python
  • 简单聊一聊Java线程池ThreadPoolExecutor
    目录简介参数说明如何创建线程池拒绝策略总结简介 ThreadPoolExecutor是一个实现ExecutorService接口的线程池,ExecutorService是主要用来处理...
    99+
    2024-04-02
  • 探讨一下JS为什么提交表单前需要序列化
    Javascript是一种被广泛应用于web前端的编程语言。在web开发中,表单(form)提交是一个非常常见的操作,而在Javascript中,提交表单前通常需要序列化(serialize)表单数据。本文旨在探讨一下Javascript为...
    99+
    2023-05-14
  • Python多线程爬虫简单示例
    python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。 虽然...
    99+
    2022-06-04
    爬虫 示例 多线程
  • Java编程之多线程死锁与线程间通信简单实现代码
    死锁定义 死锁是指两个或者多个线程被永久阻塞的一种局面,产生的前提是要有两个或两个以上的线程,并且来操作两个或者多个以上的共同资源;我的理解是用两个线程来举例,现有线程A和B同时操作两个共同资源a和b,A操作a的时候上锁LockA,继续执行...
    99+
    2023-05-30
    java 多线程 ava
  • Python写一个简单的在线编辑器
    直接奔入主题看下面pywebio程序,实现了Python的简陋在线编辑器 from pywebio.input import * from pywebio.output import...
    99+
    2024-04-02
  • python的一些简单的程序代码,python的简单程序代码
    大家好,给大家分享一下python的一些简单的程序代码,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!   Python 100个简单小例子(持续更新中) 1 编写一个计算平年还是闰年的小例子其核心是年份可以整除4和...
    99+
    2023-10-10
    python
  • Python 简单的多线程执行命令
    Tools.py#!/usr/bin/python #coding:utf-8 import threading import subprocess import os import sys sshport = 13131 log_path...
    99+
    2023-01-31
    多线程 命令 简单
  • Python入门教程(一)Python简单介绍
    目录什么是 Python?Python 可以做什么?Python可以做:为何选择 Python?Python 语法与其他编程语言比较关于偏见什么是 Python? 自20世纪90年代...
    99+
    2023-05-14
    Python入门 Python介绍
  • Python探索之实现一个简单的HTTP服务器
    Python标准库中的BaseHTTPServer模块实现了一个基础的HTTP服务器基类和HTTP请求处理类。这在文章python探索之BaseHTTPServer-实现Web服务器介绍中进行了相关的介绍。...
    99+
    2022-06-05
    简单 服务器 Python
  • python实现linux下的简单进程监
    最近看writeup看的有点头疼,深深感受到了自己的无知。确实还需要学习很多东西、一点一点的积累!加油! python确实很强大哦~,要想学好python就得自己多动手堆代码! 无聊写了一个进程监控的脚本,就当做是练习。其实最终...
    99+
    2023-01-31
    进程 简单 python
  • C++怎么实现一个简单的线程池
    本文小编为大家详细介绍“C++怎么实现一个简单的线程池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现一个简单的线程池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、设计线程池应该包括保存线程的容...
    99+
    2023-06-30
  • Golang与python线程详解及简单实例
    Golang与python线程详解及简单实例 在GO中,开启15个线程,每个线程把全局变量遍历增加100000次,因此预测结果是 15*100000=1500000. var sum int var c...
    99+
    2022-06-04
    线程 详解 实例
  • Python实现简单多线程任务队列
    最近我在用梯度下降算法绘制神经网络的数据时,遇到了一些算法性能的问题。梯度下降算法的代码如下(伪代码): def gradient_descent(): # the gradient descent...
    99+
    2022-06-04
    队列 多线程 简单
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作