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

(编辑:jimmy 日期: 2024/12/30 浏览:2)

生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开。同样的之间我们讲过多线程中的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爬虫中多线程如何进行解锁操作的资料请关注其它相关文章!