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学习笔记整理3之输入输出、python eval函数
Dec 14 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
Jan 20 Python
Django Admin实现上传图片校验功能
Mar 06 Python
Python socket实现简单聊天室
Apr 01 Python
详解Python中的四种队列
May 21 Python
对python实时得到鼠标位置的示例讲解
Oct 14 Python
python代码实现逻辑回归logistic原理
Aug 07 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
pandas中ix的使用详细讲解
Mar 09 Python
浅谈Python中的函数(def)及参数传递操作
May 25 Python
python中sqllite插入numpy数组到数据库的实现方法
Jun 21 Python
浅谈Python数学建模之整数规划
Jun 23 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
JavaScript实现动态增删表格的方法
2017/03/09 Javascript
JavaScript实现全选取消效果
2017/12/14 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
使用python实现knn算法
2017/12/20 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
Ticketmaster意大利:音乐会、节日、艺术和剧院的官方门票
2019/12/23 全球购物
什么是makefile? 如何编写makefile?
2012/08/08 面试题
AJax面试题
2014/11/25 面试题
公司道歉信范文
2014/01/09 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
cf战队宣传语
2015/07/13 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android