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 相关文章推荐
pip install urllib2不能安装的解决方法
Jun 12 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
解决Python正则表达式匹配反斜杠''\''问题
Jul 17 Python
python实现连连看辅助之图像识别延伸
Jul 17 Python
Python 可变类型和不可变类型及引用过程解析
Sep 27 Python
Django1.11配合uni-app发起微信支付的实现
Oct 12 Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 Python
tensorflow 实现从checkpoint中获取graph信息
Feb 10 Python
Python爬虫教程知识点总结
Oct 19 Python
Django自带用户认证系统使用方法解析
Nov 12 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 Python
Python中生成ndarray实例讲解
Feb 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设计模式之适配器模式代码实例
2015/05/11 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
2011/02/24 Javascript
javascript学习(二)javascript常见问题总结
2013/01/02 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
文本框回车提交与禁止提交示例
2013/09/27 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
浅谈js-FCC算法Friendly Date Ranges(详解)
2017/04/10 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python 加密的实例详解
2017/10/09 Python
Django uwsgi Nginx 的生产环境部署详解
2019/02/02 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
用python写测试数据文件过程解析
2019/09/25 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
Python colormap库的安装和使用详情
2020/10/06 Python
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
周仰杰(JIMMY CHOO)英国官方网站:闻名世界的鞋子品牌
2018/10/28 全球购物
职业技术学校毕业生推荐信
2013/12/03 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
家长通知书家长评语
2014/04/17 职场文书
医院搬迁方案
2014/06/14 职场文书
模具设计与制造专业自荐书
2014/07/01 职场文书
电影红河谷观后感
2015/06/11 职场文书
新店开业策划方案怎么书写?
2019/07/05 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery