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删除指定类型(或非指定)的文件实例详解
Jul 06 Python
Python的Django框架中模板碎片缓存简介
Jul 24 Python
python 重定向获取真实url的方法
May 11 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
Python 经典面试题 21 道【不可错过】
Sep 21 Python
对python中if语句的真假判断实例详解
Feb 18 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
Pytoch之torchvision.transforms图像变换实例
Dec 30 Python
pytorch SENet实现案例
Jun 24 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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 mysqli查询语句返回值类型实例分析
2016/06/29 PHP
Laravel创建数据库表结构的例子
2019/10/09 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
2020/10/30 PHP
Javascript 解疑
2009/11/11 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
学习jQuey中的return false
2015/12/18 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
jQuery基本选择器之标签名选择器
2016/09/03 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
2018/09/27 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
python编程实现归并排序
2017/04/14 Python
Python 支付整合开发包的实现
2019/01/23 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
python selenium操作cookie的实现
2020/03/18 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
2014年圣诞节倒计时网页的制作过程
2014/12/05 HTML / CSS
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
医生自荐信
2013/10/11 职场文书
企业公益活动策划方案
2014/08/24 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
财务审计整改报告
2014/11/06 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
护士求职自荐信范文
2015/03/04 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang