第五章 爬虫进阶(三) 2020-01-20

 三、 多线程共享全局变量的问题


多线程但是在同一进程中运行的。因此在进程中的全局变量所有线程都是可以共享的。这就造成了一个问题,因为线程执行的顺序是无序的,有可能会造成数据错误。比如以下代码:


import threading

 

ticket= 0

 

def get_ticket():

         global tickets

         for x in range(1000000):

                   tickets +=1

         print(‘tickets:%d’%tickets)

 

def main():

         for x in range(2):

                   t = threading.Thread(target=get_ticket)

                   t.start()

 

if__name__==’__main__’

         main()


以上结果正常来讲应该是1000000和2000000,但是因为多线程运行的不确定性。因此最好的结果可能是随机的。




锁机制和threading.Lock


为了解决共享全局变量问题。Threading提供了一个Lock类,这个类可以在某个线程访问某个变量的时候加锁,其他线程此时就不能进来,直到当前线程处理完后,把锁释放了,其他线程才能进来处理。示例代码如下:


import threading

 

value= 0

 

glock= threading.Lock()

 

def add_value():

global value

gLock.acquire()

    for x in range(1000000):

        value += 1

         gLock.release()

    print("value的值是:%d" % value)

 

 

def main():

    for x in range(2):

        th = threading.Thread(target=add_value)

        th.start()

 

 

if__name__ == '__main__':

    main()


全局变量共享的问题:


在多线程中,如果需要修改全局变量,那么需要在修改全局变量的地方使用锁锁起来,执行完成后再把锁释放掉。


使用锁的原则:


1、把尽量少的和不耗时的代码放到锁中执行。

2、代码执行完成后要记得释放锁。

在python中,可以使用threading.Lock来创建锁,lock.acquire()是上锁操作,lock.release()是释放锁的操作。



上一篇文章 第五章 爬虫进阶(二) 2020-01-19 地址:

https://www.jianshu.com/p/80f99226d5bb

下一篇文章 第五章 爬虫进阶(四) 2020-01-21 地址:

https://www.jianshu.com/p/f0ccbc3a538c



以上资料内容来源网络,仅供学习交流,侵删请私信我,谢谢。

你可能感兴趣的:(第五章 爬虫进阶(三) 2020-01-20)