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多线程编程中的join函数使用心得
Sep 02 Python
python实现停车管理系统
Nov 30 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
Oct 14 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
python实现飞行棋游戏
Feb 05 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
python opencv进行图像拼接
Mar 27 Python
基于opencv实现简单画板功能
Aug 02 Python
浅谈Python3中print函数的换行
Aug 05 Python
python/golang 删除链表中的元素
Sep 14 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+APACHE实现用户论证的方法
2006/10/09 PHP
优化PHP代码的53条建议
2008/03/27 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
详谈PHP编码转换问题
2015/07/28 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
node.js中的events.emitter.listeners方法使用说明
2014/12/10 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
JS中BOM相关知识点总结(必看篇)
2016/11/22 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
Python深入学习之对象的属性
2014/08/31 Python
使用Python写个小监控
2016/01/27 Python
使用python爬虫实现网络股票信息爬取的demo
2018/01/05 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
python程序如何进行保存
2020/07/03 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
推荐一些比较有用的css3新属性
2014/11/11 HTML / CSS
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
一份婚庆公司创业计划书
2014/01/11 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python
python如何为list实现find方法
2022/05/30 Python