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实现的Kmeans++算法实例
Apr 26 Python
jupyter安装小结
Mar 13 Python
python中星号变量的几种特殊用法
Sep 07 Python
python入门教程 python入门神图一张
Mar 05 Python
Jupyter中直接显示Matplotlib的图形方法
May 24 Python
python和shell获取文本内容的方法
Jun 05 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
Feb 21 Python
使用Python进行体育竞技分析(预测球队成绩)
May 16 Python
Django实现跨域的2种方法
Jul 31 Python
python内置模块collections知识点总结
Dec 19 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
Jun 11 Python
Python如何批量生成和调用变量
Nov 21 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
漂亮但不安全的CTB
2006/10/09 PHP
用php+javascript实现二级级联菜单的制作
2008/05/06 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
PHP 调试工具Debug Tools
2011/04/30 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
javascript之bind使用介绍
2011/10/09 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
Python查看微信撤回消息代码
2018/06/07 Python
简单了解python变量的作用域
2019/07/30 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
Python3常见函数range()用法详解
2019/12/30 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
对Python 字典元素进行删除的方法
2020/07/31 Python
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
大学生职业生涯规划书范文
2014/01/04 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
银行奉献演讲稿
2014/09/16 职场文书
未婚证明书模板
2014/10/08 职场文书
卫生院义诊活动总结
2015/05/07 职场文书
运动会致辞稿
2015/07/29 职场文书
大学生党员暑假实践(活动总结)
2019/08/21 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python