python3爬虫中多线程进行解锁操作实例


Posted in Python onNovember 25, 2020

生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开。同样的之间我们讲过多线程中的lock,作用是为了不让多个线程运行是出错所以进行锁住的指令。但是鉴于我们实际运用中,因为线程和指令不会只有一个,如果全部都进行lock操作就会出错。所以今天小编为大家进行lock的全面讲解,同时为大家带来lock的解锁方法。

由于线程之间随机调度,所以在使用共享变量时,某线程可能在执行n条后,CPU接着执行其他线程,很容易使得最终结果出错。为了多个线程同时操作一个内存中的资源时不产生混乱,我们可以使用锁。

Lock(指令锁)是可用的最低级的同步指令。Lock处于锁定状态时,不被特定的线程拥有。Lock包含两种状态——锁定和非锁定,以及两个基本的方法。

当线程请求锁定时,其他线程就不能获得这把锁,直到锁定的线程释放锁,其他线程才能继续使用。这就好比使用独卫,某个人进去了,把门锁上了,另一个人必须等待里面的人出来才能继续使用。

指令锁只能被同一个线程调用一次,如果需要多次请求,则需要了解一下可重入锁。

RLock(可重入锁)是一个可以被同一个线程请求多次的同步指令。RLock使用了“拥有的线程”和“递归等级”的概念,处于锁定状态时,RLock被某个线程拥有。拥有RLock的线程可以再次调用acquire(),释放锁时需要调用release()相同次数。

具体方法如下:

acquire([timeout]): 请求获得锁定。使线程进入同步阻塞状态。

release(): 释放锁。使用前线程必须已获得锁定,否则将抛出异常。

关于线程的锁的案例,这里给出一个简单的指令锁的示例,主要看下锁的作用。

import threading
sub = 0
num = 1000000
lock = threading.Lock()
def add():
  global sub,num
  for i in range(1,num):
    # 请求锁
    lock.acquire()
    sub += 1
    # 释放锁
    lock.release()
def red():
    sub -= 1
def main():
  print("开始运算,sub的值为{}".format(sub))
  t1 = threading.Thread(target=add,args=())
  t2 = threading.Thread(target=red,args=())
  t1.start()
  t2.start()
  t1.join()
  t2.join()
  print("结束运算,sub的值为{}".format(sub))
if __name__ == '__main__':
main()

有锁时,肯定是交替执行加减算法,但最后结果肯定还是可以为0。

python3爬虫中多线程进行解锁操作实例

注释锁后,再来看下结果。

python3爬虫中多线程进行解锁操作实例

再多执行几次后,会发现结束运算后的sub值每次都不一样,这其实就是因为共享变量,线程之间产生了混乱,导致sub的值无法确定。

以上就是python3爬虫中多线程进行解锁操作实例的详细内容,更多关于python3爬虫中多线程如何进行解锁操作的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python3图片转换二进制存入mysql
Dec 06 Python
python中实现定制类的特殊方法总结
Sep 28 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
python爬虫学习笔记之pyquery模块基本用法详解
Apr 09 Python
python3中编码获取网页的实例方法
Nov 16 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
Python基础之Socket通信原理
Apr 22 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
Python制作一个随机抽奖小工具的实现
Jul 07 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 #Python
python 基于wx实现音乐播放
Nov 24 #Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 #Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 #Python
python实现企业微信定时发送文本消息的示例代码
Nov 24 #Python
python爬虫快速响应服务器的做法
Nov 24 #Python
PyCharm Community安装与配置的详细教程
Nov 24 #Python
You might like
php中常用编辑器推荐
2007/01/02 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
php经典算法集锦
2015/11/14 PHP
php求数组全排列,元素所有组合的方法
2016/05/05 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
JS简单生成两个数字之间随机数的方法
2016/08/03 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
2019/06/24 Javascript
python学习教程之使用py2exe打包
2017/09/24 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Python中enumerate函数代码解析
2017/10/31 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
Django 反向生成url实例详解
2019/07/30 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
python模块内置属性概念及实例
2021/02/18 Python
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
内部类的定义、种类以及优点
2013/10/16 面试题
车辆维修工自我评价怎么写
2013/09/20 职场文书
教育课题研究自我鉴定范文
2013/12/28 职场文书
年会活动策划方案
2014/01/23 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
大学生入党群众意见书
2015/06/02 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
vue如何清除浏览器历史栈
2022/05/25 Vue.js