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中比较特别的除法运算和幂运算介绍
Apr 05 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
详解在Python程序中自定义异常的方法
Oct 16 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
python实现自动发送邮件
Jun 20 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
flask session组件的使用示例
Dec 25 Python
python定位xpath 节点位置的方法
Aug 27 Python
python实现单链表的方法示例
Sep 03 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
Python 循环读取数据内存不足的解决方案
May 25 Python
Python连续赋值需要注意的一些问题
Jun 03 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
在Windows中安装Apache2和PHP4的权威指南
2006/10/09 PHP
PHP时间戳与日期之间转换的实例介绍
2013/04/19 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
浏览器兼容的JS写法总结
2016/04/27 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
jQuery事件委托之Safari
2016/07/05 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
Python编程之属性和方法实例详解
2015/05/19 Python
python处理数据,存进hive表的方法
2018/07/04 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
python利用多种方式来统计词频(单词个数)
2019/05/27 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
简单了解python元组tuple相关原理
2019/12/02 Python
python时间日期操作方法实例小结
2020/02/06 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
联想C++笔试题
2012/06/13 面试题
厂长助理岗位职责
2013/12/27 职场文书
红旗方阵解说词
2014/02/12 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
《悯农》教学反思
2014/04/28 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
学雷锋宣传标语
2014/06/25 职场文书
警察群众路线整改措施
2014/09/26 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android