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 相关文章推荐
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
python验证码识别的实例详解
Sep 09 Python
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python numpy 部分排序 寻找最大的前几个数的方法
Jun 27 Python
Python求正态分布曲线下面积实例
Nov 20 Python
使用python实现希尔、计数、基数基础排序的代码
Dec 25 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
Python正则表达式如何匹配中文
May 27 Python
python 调用API接口 获取和解析 Json数据
Sep 28 Python
python3 hdf5文件 遍历代码
May 19 Python
Python中json.load()和json.loads()有哪些区别
Jun 07 Python
Python实现学生管理系统(面向对象版)
Jun 24 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传输数据的代码
2007/11/13 PHP
php htmlspecialchars加强版
2010/02/16 PHP
PHP最常用的2种设计模式工厂模式和单例模式介绍
2012/08/14 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
php中final关键字用法分析
2016/12/07 PHP
javascript 读取xml,写入xml 实现代码
2009/07/10 Javascript
javascript中的new使用
2010/03/20 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
基于python实现学生信息管理系统
2019/11/22 Python
python随机数分布random均匀分布实例
2019/11/27 Python
Python requests模块session代码实例
2020/04/14 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
房屋转让协议书范本
2014/04/11 职场文书
需求分析说明书
2014/05/09 职场文书
和谐社区口号
2014/06/19 职场文书
售房协议书范本2014
2014/10/23 职场文书
公务员考察材料
2014/12/23 职场文书
2015年外联部工作总结
2015/04/03 职场文书
525心理健康活动总结
2015/05/08 职场文书