python3爬虫中多线程进行解锁操作实例

作者:小妮浅浅 时间:2021-04-29 00:16:42 

生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开。同样的之间我们讲过多线程中的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,爬虫,多线程,解锁操作
0
投稿

猜你喜欢

  • numpy给array增加维度np.newaxis的实例

    2023-06-30 06:41:34
  • XMLTextReader和XmlDocument读取XML文件的比较

    2008-09-05 16:04:00
  • 屏蔽Flash 右键菜单的方法

    2008-05-24 07:21:00
  • 分享PHP函数实现数字与文字分页代码

    2023-11-14 12:32:54
  • python读文件逐行处理的示例代码分享

    2023-03-17 03:54:04
  • python中将字典转换成其json字符串

    2023-10-16 23:46:41
  • Python中星号的五种用法小结

    2022-12-06 16:17:23
  • wxPython绘图模块wxPyPlot实现数据可视化

    2023-10-03 14:58:22
  • 人性化网页设计技巧

    2007-10-15 13:02:00
  • python实现逢七拍腿小游戏的思路详解

    2021-02-28 23:44:29
  • SQL Server查询速度慢的原因及优化方法

    2009-01-05 13:46:00
  • python 三元运算符使用解析

    2021-05-02 17:03:28
  • python实现批量解析邮件并下载附件

    2023-07-05 02:32:16
  • 如何快捷地实现分页显示功能?

    2010-01-01 15:08:00
  • Python源码学习之PyObject和PyTypeObject

    2023-08-11 10:28:45
  • Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法

    2023-12-19 22:42:41
  • Python命令行库click的具体使用

    2023-07-05 02:51:16
  • MySQL UPDATE delete 语句的速度

    2008-03-12 12:22:00
  • 使用Turtle画正螺旋线的方法

    2022-12-08 20:49:31
  • Python绘制loss曲线和准确率曲线实例代码

    2021-05-21 07:15:13
  • asp之家 网络编程 m.aspxhome.com