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 02 Python
详解Django中的ifequal和ifnotequal标签使用
Jul 16 Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
python3实现基于用户的协同过滤
May 31 Python
python try 异常处理(史上最全)
Mar 07 Python
Python初学者常见错误详解
Jul 02 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
对Django 中request.get和request.post的区别详解
Aug 12 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 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中对缓冲区的控制实现代码
2013/09/29 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
探寻JavaScript中this指针指向
2016/04/23 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
基于JavaScript实现点击页面任何位置返回
2016/08/31 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
centos 上快速搭建ghost博客方法分享
2018/05/23 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
2014/06/04 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
python绘制简单折线图代码示例
2017/12/19 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
python super的使用方法及实例详解
2019/09/25 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
利用Python优雅的登录校园网
2020/10/21 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
英国香水店:The Perfume Shop
2017/03/27 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
介绍下Java中==和equals的区别
2013/09/01 面试题
军训学生自我鉴定
2014/02/12 职场文书
《白鹅》教学反思
2014/04/13 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
MySQL创建定时任务
2022/01/22 MySQL