这篇文章主要介绍python3爬虫中多线程进行解锁的操作方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开。同样的之间我们讲过多线程中的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(): global sub,num for i in range(1,num): # 请求锁 lock.acquire() sub -= 1 # 释放锁 lock.release() 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。
注释锁后,再来看下结果。
再多执行几次后,会发现结束运算后的sub值每次都不一样,这其实就是因为共享变量,线程之间产生了混乱,导致sub的值无法确定。
以上是“python3爬虫中多线程进行解锁的操作方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。