(八)8-1多进程锁和共享内存

多进程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

 

转载于:https://www.cnblogs.com/pythonlx/p/8025625.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值