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类的多重继承问题深入分析
Nov 09 Python
详解python中的json的基本使用方法
Dec 21 Python
python正则表达式的使用
Jun 12 Python
使用python实现ANN
Dec 20 Python
Python从零开始创建区块链
Mar 06 Python
python smtplib发送带附件邮件小程序
May 22 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 Python
python爬取豆瓣电影TOP250数据
May 23 Python
Python读写yaml文件
Mar 20 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
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
Javascript的并行运算实现代码
2010/11/19 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
JavaScript设计模式之观察者模式(发布订阅模式)原理与实现方法示例
2018/07/27 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
python list语法学习(带例子)
2013/11/01 Python
python字符串对其居中显示的方法
2015/07/11 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Python实现完整的事务操作示例
2017/06/20 Python
python format 格式化输出方法
2018/07/16 Python
对Python3中bytes和HexStr之间的转换详解
2018/12/04 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
python实现可变变量名方法详解
2019/07/01 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
python利用opencv保存、播放视频
2020/11/02 Python
Python 列表反转显示的四种方法
2020/11/16 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
如何通过jdbc调用存储过程
2012/04/19 面试题
法学院毕业生求职信
2014/06/25 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers
MySQL存储过程及语法详解
2022/08/05 MySQL