定义:当使用多进程进行文件读写时,如果一个进程为读文件另一个为写文件,则两者无法同事进行,必须要先执行写操作然后进行读操作,并且有多个线程共享资源时,只能有一个进程进行访问,这样就需要一个锁的机制。
设计实例:
运行两个线程一个对数字加一,一个对数据加三:
当不加锁时:
def add(nu,value,lock): print ("init add {0} number {1}".format(value, nu)) with lock: for i in xrange(1, 6): time.sleep(2) nu += value print ("add {0} number {1}".format(value, nu)) if __name__=="__main__": lock=multiprocessing.Lock() nu=0 p1=multiprocessing.Process(target=add,args=(nu,1,lock)) p2 = multiprocessing.Process(target=add, args=(nu, 3, lock)) p1.start() p2.start()
结果:
C:\Python27\python.exe E:/untitled/Mutil/M3.py init add 1 number 0 init add 3 number 0 add 1 number 1 add 3 number 3 add 1 number 2 add 3 number 6 add 1 number 3 add 3 number 9 add 1 number 4 add 3 number 12 add 1 number 5 add 3 number 15 Process finished with exit code 0
加锁后:
def add(nu,value,lock): #----加锁后: print ("init add {0} number {1}".format(value, nu)) lock.acquire() try: for i in xrange(1, 6): time.sleep(2) nu+=value print (" add {0} number {1}".format(value, nu)) except Exception as e: raise e finally: lock.release()
C:\Python27\python.exe E:/untitled/Mutil/M3.py init add 1 number 0 init add 3 number 0 add 1 number 1 add 1 number 2 add 1 number 3 add 1 number 4 add 1 number 5 add 3 number 3 add 3 number 6 add 3 number 9 add 3 number 12 add 3 number 15
发现不是之前的一同运行而是谁抢到锁的权限谁就先执行后者再执行。
关于共享内存:
顾名思义由两个或者两个以上线程一同操作的空间。
import multiprocessing import time def add(nu,value,lock): #----加锁后: print ("init add {0} number {1}".format(value, nu.value)) lock.acquire() try: for i in xrange(1, 6): time.sleep(2) nu.value+=value print (" add {0} number {1}".format(value, nu.value)) except Exception as e: raise e finally: lock.release() if __name__=="__main__": lock=multiprocessing.Lock() nu=multiprocessing.Value('i',0) p1=multiprocessing.Process(target=add,args=(nu,1,lock)) p2 = multiprocessing.Process(target=add, args=(nu, 3, lock)) p1.start() p2.start()
C:\Python27\python.exe E:/untitled/Mutil/M4.py init add 1 number 0 init add 3 number 0 add 1 number 1 add 1 number 2 add 1 number 3 add 1 number 4 add 1 number 5 add 3 number 8 add 3 number 11 add 3 number 14 add 3 number 17 add 3 number 20 Process finished with exit code 0
用上可知通过加锁两个线程依次执行并且结果保留。
浙公网安备 33010602011771号