为防止多个线程共同对某个数据进行修改,可能出现不可预料的结果,为了保证数据的正确,需要对多个线程进行同步。使用Thread对象的Lock和RLock可实现简单的线程同步。

Lock和Rlock对象都有acquire方法和release方法,对于每次只允许一个线程操作的数据,可以将其操作放到acquire和release方法之间。

Lock对象:如果一个线程连续两次进行acquire操作,第二次acquire操作将挂起线程,因为第一次acquire操作之后没有reliease,这时会导致Lock对象永远不会release,使得线程死锁。

Rlock对象:允许一个线程多词进行acquire操作,因为在其内部通过一个counter变量维护者着一个现成acquire的次数。而且每一次的acqure操作必须有一次release操作与之对应,在素有的release操作完成之后,别的现成才能申请该RLock对象。

例子:

import threading


mylock = threading.RLock()
num =
0

class myThread(threading.Thread):
   
def __init__(self,name):
        threading.Thread.
__init__(self,name=name)

   
def run(self):
       
global num
       
while True:
            mylock.acquire()
           
print('%s locked,Number:%d'%(threading.current_thread().name,num))
           
if num>=4:
                mylock.release()
               
print('%s released,Number:%d'%(threading.current_thread().name,num))
               
break
           
num+=1
           
print('%s released,Number:%d'%(threading.current_thread().name,num))
            mylock.release()

if __name__=='__main__':
    thread1 = myThread(
'Thread_1')
    thread2 = myThread(
'Thread_2')
    thread1.start()
    thread2.start()

python爬虫预备知识-线程同步_数据