1. 程式人生 > >(七)8-1多進程鎖和共享內存

(七)8-1多進程鎖和共享內存

nal orm 讀寫文件 多個 start except 讀寫 結束 syn

多進程Lock組件
當我們使用多進程讀寫文件時,一個進程寫文件,一個進程讀文件。如果兩個進程同時進行,肯定不行,必須等寫結束後,才可以進行多操作。或者多個進程在共享一些資源時,同時只能有一個進程進行訪問,需要一個鎖機制控制。

import multiprocessing
import time
lock = multiprocessing.Lock()
def add(number,value,lock):
with lock:
print "init add{0} number={1}".format(value,number)
for i in xrange(1,5):
number += value
time.sleep(1)
print "add{0} num = {1}".format(value,number)


if __name__ == "__main__":
number = 0
lock = multiprocessing.Lock()
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
init add1 number=0
init add3 number=0
add1 num = 1
add3 num = 3
add1 num = 2
add3 num = 6
add1 num = 3
add3 num = 9
add1 num = 4
add3 num = 12

加鎖操作with lock 方式使用:
#!/usr/bin/env python
#coding:utf8
# import multiprocessing
# lock = multiprocessing.Lock()
# lock.acquire() 獲得鎖
# lock.release() 釋放鎖
#with lock 方式使用
# 不加鎖
# number + 1
# number + 3

import multiprocessing
import time
lock = multiprocessing.Lock()
def add(number,value,lock):
with lock:
print "init add{0} number={1}".format(value,number)
for i in xrange(1,5):
number += value
time.sleep(1)
print "add{0} num = {1}".format(value,number)


if __name__ == "__main__":
number = 0
lock = multiprocessing.Lock()
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
init add1 number=0
add1 num = 1
add1 num = 2
add1 num = 3
add1 num = 4
init add3 number=0
add3 num = 3
add3 num = 6
add3 num = 9
add3 num = 12

lock.acquire方式使用

import multiprocessing
import time
lock = multiprocessing.Lock()
def add(number,value,lock):
# with lock:
lock.acquire()
try:
print "init add{0} number={1}".format(value,number)
for i in xrange(1,5):
number += value
time.sleep(1)
print "add{0} num = {1}".format(value,number)
except Exception as e:
raise e
finally:
lock.release()

if __name__ == "__main__":
number = 0
lock = multiprocessing.Lock()
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
init add1 number=0
add1 num = 1
add1 num = 2
add1 num = 3
add1 num = 4
init add3 number=0
add3 num = 3
add3 num = 6
add3 num = 9
add3 num = 12

共享內存:
python的multiprocessing模塊也給我們提供了共享內存的操作
一般的變量在進程之間是沒法進行通訊的,multiprocessing給我們提供了
import multiprocessing
import time
def change(arr):
for i in range(len(arr)):
arr[i] = -arr[i]
if __name__ == "__main__":
print "main start"
arr = multiprocessing.Array(‘i‘,range(10))
print arr[:]
p3 = multiprocessing.Process(target=change,args=(arr,))
p3.start()
p3.join()
print arr[:]


import multiprocessing
import time

def add(number,add_value):
try:
print "init add{0} number={1}".format(add_value, number.value)
for i in xrange(1, 5):
old_number_value = number.value
number.value += add_value
print " add{0} num {2} = {0} + {1}".format(add_value,old_number_value, number.value)
print "#####add{0} has added #####".format(add_value)
time.sleep(1)
print "add{0} num = {1}".format(add_value, number.value)
except Exception as e:
raise e

if __name__ == "__main__":
print "main start"
number = multiprocessing.Value(‘i‘,0)
print number
p1 = multiprocessing.Process(target=add,args=(number,1))
p2 = multiprocessing.Process(target=add,args=(number,3))
p1.start()
p2.start()
print "main end"
運行結果:
main start
<Synchronized wrapper for c_long(0)>
main end
init add1 number=0
add1 num 1 = 1 + 0
#####add1 has added #####
init add3 number=1
add3 num 4 = 3 + 1
#####add3 has added #####
add1 num = 4
add1 num 5 = 1 + 4
#####add1 has added #####
add3 num = 5
add3 num 8 = 3 + 5
#####add3 has added #####
add1 num = 8
add1 num 9 = 1 + 8
#####add1 has added #####
add3 num = 9
add3 num 12 = 3 + 9
#####add3 has added #####
add1 num = 12
add1 num 13 = 1 + 12
#####add1 has added #####
add3 num = 13
add3 num 16 = 3 + 13
#####add3 has added #####
add1 num = 16
add3 num = 16

Process finished with exit code 0

(七)8-1多進程鎖和共享內存