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实现计算资源图标crc值的方法
Oct 05 Python
Python实现简单状态框架的方法
Mar 19 Python
Python中处理时间的几种方法小结
Apr 09 Python
python使用MySQLdb访问mysql数据库的方法
Aug 03 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
浅谈Python反射 & 单例模式
Mar 21 Python
dpn网络的pytorch实现方式
Jan 14 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
Pytorch 使用CNN图像分类的实现
Jun 16 Python
解决tensorflow读取本地MNITS_data失败的原因
Jun 22 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/10/20 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
javascript奇异的arguments分析
2010/10/20 Javascript
体验js中splice()的强大(插入、删除或替换数组的元素)
2013/01/16 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
微信小程序实现购物车功能
2020/11/18 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
下载糗事百科的内容_python版
2008/12/07 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
专升本自我鉴定
2013/10/10 职场文书
年度考核自我鉴定
2014/03/19 职场文书
小学生手册家长评语
2014/04/16 职场文书
党员承诺践诺书
2014/05/20 职场文书
理想演讲稿范文
2014/05/21 职场文书
电教室标语
2014/06/20 职场文书
宣传活动总结范文
2014/07/01 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
承诺书样本
2014/08/30 职场文书
二手车转让协议书
2015/01/29 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技