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解析最简单的验证码
Jan 07 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 Python
对Python3中的input函数详解
Apr 22 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
Python Django 命名空间模式的实现
Aug 09 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
PyTorch-GPU加速实例
Jun 23 Python
Python截图并保存的具体实例
Jan 14 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获取文件大小的方法
2014/02/26 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
css+js实现部分区域高亮可编辑遮罩层
2014/03/04 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
vue2中使用less简易教程
2018/03/27 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
Vue.js数字输入框组件使用方法详解
2019/10/19 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
Python 日期与时间转换的方法
2020/08/01 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
实习护理工作自我评价
2013/09/25 职场文书
公司企业表扬信
2014/01/11 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
中秋节晚会开场白
2015/05/29 职场文书
郭明义观后感
2015/06/08 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书