您的位置:首页 > 其它

八周一次课(12月11日) 14.4 多进程锁 14.5 多进程共享内存

2017-12-11 17:25 489 查看

八周一次课(12月11日)

14.4 多进程锁

Lock组件

当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件,如果两个文件同时进行,肯定是不行的,必须是文件写结束以后,才可以进行读操作。或者是多个进程在共享一些资源的时候,同时只能有一个进程进行访问,那就要有一个锁机制进行控制。

需求:

一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来

我们可以通过进程的join()方法来实现,但是为了学习Lock,用Lock来实现。

先看不加锁程序,在看加锁程序,最后比较两个程序的区别

lock 方法

import multiprocessing

lock = multiprocessing.Lock()
lock.acquire()      获取锁
lock.release()      释放锁

with lock:
缩进跟命令,执行完后会自动释放


示例

import multiprocessing

import time

def add1(number,value,lock):
with lock :
print("init add {1} number = {0} ".format(number,value))
for i in xrange(1,6):
number += value
time.sleep(1)
print("add {1} number = {0}".format(number,value))

if __name__ == "__main__":
lock = multiprocessing.Lock()
number = 0
p1 = multiprocessing.Process(target=add1,args=(number,1,lock))
p2 = multiprocessing.Process(target=add1,args=(number,3,lock))
p1.start()
p2.start()
print("main end")


结果

main end
init add 1 number = 0
add 1 number = 1
add 1 number = 2
add 1 number = 3
add 1 number = 4
add 1 number = 5
init add 3 number = 0
add 3 number = 3
add 3 number = 6
add 3 number = 9
add 3 number = 12
add 3 number = 15


两个进程谁先抢到锁谁就先执行,不一定是p1先执行,不加with lock 则p1 p2同时执行

14.5 多进程共享内存

共享内存

python的multiprocessing模块也给我们提供了共享内存的操作

一般的变量在进程之间是没法进行通讯的,multiprocessing给我们提供了Value和Array模块,他们可以在不通的进程中共同使用

示例

将个函数的结果赋给第二个函数

import multiprocessing

def add(number,add_value,):
try:
print("init add {0} number = {1} ".format(add_value,number.value))
for i in xrange(1,6):
number.value += add_value
print("add {0} number = {1}".format(add_value,number.value))
except Exception as e:
raise e


if name == “main“:

number = multiprocessing.Value(‘i’,0)

p1 = multiprocessing.Process(target=add,args=(number,1))

p2 = multiprocessing.Process(target=add,args=(number,3))

p1.start()

p2.start()

print(“main end”)

结果

main end
init add 1 number = 0
add 1 number = 1
add 1 number = 2
add 1 number = 3
add 1 number = 4
add 1 number = 5
init add 3 number = 5
add 3 number = 8
add 3 number = 11
add 3 number = 14
add 3 number = 17
add 3 number = 20

if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(10))
m = 10
p = Process(target=f, args=(num, arr, m))
p.start()
p.join()
print(num.value)
print(arr[:])
print(m)

'c': ctypes.c_char,
'b': ctypes.c_byte,
'B': ctypes.c_ubyte,
'h': ctypes.c_short,
'H': ctypes.c_ushort,
'i': ctypes.c_int,
'I': ctypes.c_uint,
'l': ctypes.c_long,
'L': ctypes.c_ulong,
'f': ctypes.c_float,
'd': ctypes.c_double
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: