Lock组件
当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件,如果两个文件同时进行,肯定是不行的,必须是文件写结束以后,才可以进行读操作。或者是多个进程在共享一些资源的时候,同时只能有一个进程进行访问,那就要有一个锁机制进行控制。
需求:
一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来
我们可以通过进程的join()方法来实现,但是为了学习Lock,用Lock来实现。
先看不加锁程序,在看加锁程序,最后比较两个程序的区别
不加锁:
import multiprocessing
import time
#lock = multiprocessing.Lock()
# #获得锁
# lock.acquire()
# #释放锁
# lock.release()
#with lock 能自动释放锁
def add(number,value,lock):
# with lock:
print ("int add{0} number ={1}".format(value,number))
for i in xrange(5):
number +=value
time.sleep(1)
print ("add{0} number ={1}".format(value,number))
if __name__ == '__main__':
lock = multiprocessing.Lock()
number = 0
p1 = multiprocessing.Process(target=add,args=(number,1,lock))
p2 = multiprocessing.Process(target=add,args=(number,3,lock))
p1.start()
p2.start()
print("main end")
结果:
main end
int add1 number =0
int add3 number =0
add1 number =1
add3 number =3
add1 number =2
add3 number =6
add1 number =3
add3 number =9
add1 number =4
add3 number =12
add1 number =5
add3 number =15
加锁:
import multiprocessing
import time
def add(number,value,lock):
with lock:
print ("int add{0} number ={1}".format(value,number))
for i in xrange(5):
number +=value
time.sleep(1)
print ("add{0} number ={1}".format(value,number))
if __name__ == '__main__':
lock = multiprocessing.Lock()
number = 0
p1 = multiprocessing.Process(target=add,args=(number,1,lock))
p2 = multiprocessing.Process(target=add,args=(number,3,lock))
p1.start()
p2.start()
print("main end")
结果:
main end
int add1 number =0
add1 number =1
add1 number =2
add1 number =3
add1 number =4
add1 number =5
int add3 number =0
add3 number =3
add3 number =6
add3 number =9
add3 number =12
add3 number =15
共享内存
python的multiprocessing模块也给我们提供了共享内存的操作
一般的变量在进程之间是没法进行通讯的,multiprocessing给我们提供了Value和Array模块,他们可以在不通的进程中共同使用
示例:
import time
import multiprocessing
def add(number,add_value):
print ("int add{0} number ={1}".format(add_value,number.value))
for i in xrange(5):
number.value +=add_value
print ('##add {0} has added!##'.format(add_value))
time.sleep(1)
print ("add{0} number ={1}".format(add_value,number.value))
def change(arr):
for i in range(len(arr)):
arr[i]=-arr[i]
if __name__ == '__main__':
number = multiprocessing.Value('i',0)
p1 = multiprocessing.Process(target=add,args=(number,1))
p2 = multiprocessing.Process(target=add,args=(number,3))
arr = multiprocessing.Array('i',range(5))
p3 = multiprocessing.Process(target=change,args=(arr,))
p1.start()
p2.start()
p3.start()
print(arr[:])
print("main end")
结果:
[0, 1, 2, 3, 4]
main end
int add1 number =0
##add 1 has added!##
int add3 number =1
##add 3 has added!##
add1 number =4
##add 1 has added!##
add3 number =5
##add 3 has added!##
add1 number =8
##add 1 has added!##
add3 number =9
##add 3 has added!##
add1 number =12
##add 1 has added!##
add3 number =13
##add 3 has added!##
add1 number =16
##add 1 has added!##
add3 number =17
##add 3 has added!##
add1 number =20
add3 number =20