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 相关文章推荐
python输出指定月份日历的方法
Apr 23 Python
详解Django缓存处理中Vary头部的使用
Jul 24 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
Python装饰器用法实例总结
Feb 07 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
选择python进行数据分析的理由和优势
Jun 25 Python
使用apiDoc实现python接口文档编写
Nov 19 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
Mar 24 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
Python 正则模块详情
Nov 02 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 select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
js select option对象小结
2013/12/20 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
TensorFlow变量管理详解
2018/03/10 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
Django修改app名称和数据表迁移方案实现
2020/09/17 Python
python破解同事的压缩包密码
2020/10/14 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
CSS3中的@keyframes关键帧动画的选择器绑定
2016/06/13 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
给女儿的表扬信
2014/01/18 职场文书
世界地球日活动总结
2015/02/09 职场文书
表扬信范文
2015/05/04 职场文书
三八节活动简报
2015/07/20 职场文书
2016幼儿教师自荐信范文
2016/01/28 职场文书
当你找不到方向的时候,不妨读读刘备的一生
2019/08/05 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书