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查询Mysql时返回字典结构的代码
Jun 18 Python
Python中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
Python中遇到的小问题及解决方法汇总
Jan 11 Python
python递归查询菜单并转换成json实例
Mar 27 Python
Python随机生成手机号、数字的方法详解
Jul 21 Python
对Python中DataFrame按照行遍历的方法
Apr 08 Python
详谈python在windows中的文件路径问题
Apr 28 Python
python自动发送邮件脚本
Jun 20 Python
python制作简单五子棋游戏
Jun 18 Python
解决yum对python依赖版本问题
Jul 05 Python
Python 依赖库太多了该如何管理
Nov 08 Python
Python sql注入 过滤字符串的非法字符实例
Apr 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
一个好用的分页函数
2006/11/16 PHP
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
php计算函数执行时间的方法
2015/03/20 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
URI、URL和URN之间的区别与联系
2006/12/20 Javascript
JavaScript 中的事件教程
2007/04/05 Javascript
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
在Python程序中实现分布式进程的教程
2015/04/28 Python
利用Python脚本在Nginx和uwsgi上部署MoinMoin的教程
2015/05/05 Python
python版本单链表实现代码
2018/09/28 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
python变量命名的7条建议
2019/07/04 Python
解决pycharm 安装numpy失败的问题
2019/12/05 Python
Python转换字典成为对象,可以用"."方式访问对象属性实例
2020/05/11 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
小学学校评估方案
2014/06/08 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
家庭经济困难证明
2015/06/23 职场文书
中秋节主题班会
2015/08/14 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
2019毕业论文致谢词
2019/06/24 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
python图片灰度化处理的几种方法
2021/06/23 Python
简单谈谈Python面向对象的相关知识
2021/06/28 Python
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python