这篇文章主要介绍python3爬虫中多线程进行解锁的操作方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
创新互联是专业的南京网站建设公司,南京接单;提供做网站、成都网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行南京网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开。同样的之间我们讲过多线程中的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爬虫中多线程进行解锁的操作方法”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!