python学习—Day41—多进程锁与多进程共享内存
2017-12-11 23:27
525 查看
多进程锁:
需求:一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来
我们可以通过join()方法实现,这里为了学习Lock,用lock实现。
先看不加锁程序,再看加锁程序,对比两者的区别。
#@File :jinchenglock.py import multiprocessing import time lock = multiprocessing.Lock() lock.acquire() #获得锁 lock.release() #释放锁.这两者可以直接使用with lock一句实现 #不加锁 # number +1 # number +3 def add(number, value, lock): # with lock: print("init add{0} number = {1}".format(value, number)) for i in xrange(1, 6): 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
init add1 number = 0
init 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
使用锁:
#@File :jinchenglock.py import multiprocessing import time lock = multiprocessing.Lock() lock.acquire() #获得锁 lock.release() #释放锁.这两者可以直接使用with lock一句实现 #不加锁 # number +1 # number +3 def add(number, value, lock): with lock: print("init add{0} number = {1}".format(value, number)) for i in xrange(1, 6): 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
init add1 number = 0
add1 number = 1
add1 number = 2
add1 number = 3
add1 number = 4
add1 number = 5
init add3 number = 0
add3 number = 3
add3 number = 6
add3 number = 9
add3 number = 12
add3 number = 15
#@File :jinchenglock.py import multiprocessing import time lock = multiprocessing.Lock() lock.acquire() #获得锁 lock.release() #释放锁.这两者可以直接使用with lock一句实现 #不加锁 # number +1 # number +3 def add(number, value, lock): lock.acquire() try: print("init add{0} number = {1}".format(value, number)) for i in xrange(1, 6): number += value time.sleep(1) print("add{0} number = {1}".format(value, number)) except Exception as e: raise e finally: lock.release() 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
init add1 number = 0
add1 number = 1
add1 number = 2
add1 number = 3
add1 number = 4
add1 number = 5
init add3 number = 0
add3 number = 3
add3 number = 6
add3 number = 9
add3 number = 12
add3 number = 15
多进程共享内存:
#@File :jinchenglock.py 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, 6): 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)) 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 add1 number = 0
############### add1 has added ###########
init add3 number = 1
############### add3 has added ###########
add1 number = 4
############### add1 has added ###########
add3 number = 5
############### add3 has added ###########
add1 number = 8
############### add1 has added ###########
add3 number = 9
############### add3 has added ###########
add1 number = 12
############### add1 has added ###########
add3 number = 13
############### add3 has added ###########
add1 number = 16
add3 number = 16
############### add1 has added ###########
############### add3 has added ###########
add1 number = 20
add3 number = 20
#@File :jinchenglock.py import multiprocessing import time # Value() 数值 # Array() 数组 def add(number, add_value, lock): lock.acquire() 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} has added ########### ".format(add_value)) time.sleep(1) print("add{0} number = {1}".format(add_value, number.value)) except Exception as e: raise e finally: lock.release() def change(arr): for i in range(len(arr)): arr[i] = -arr[i] if __name__ == "__main__": lock = multiprocessing.Lock() number = multiprocessing.Value('i', 0) arr = multiprocessing.Array('i', range(10)) p1 = multiprocessing.Process(target=add, args=(number, 1, lock)) p2 = multiprocessing.Process(target=add, args=(number, 3, lock)) p3 = multiprocessing.Process(target=change, args=(arr, )) p1.start() p2.start() p3.start() p3.join() print(arr[:]) print ("main end")
init add1 number = 0
############### add1 has added ###########
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
main end
add1 number = 1
############### add1 has added ###########
add1 number = 2
############### add1 has added ###########
add1 number = 3
############### add1 has added ###########
add1 number = 4
############### add1 has added ###########
add1 number = 5
init add3 number = 5
############### add3 has added ###########
add3 number = 8
############### add3 has added ###########
add3 number = 11
############### add3 has added ###########
add3 number = 14
############### add3 has added ###########
add3 number = 17
############### add3 has added ###########
add3 number = 20
相关文章推荐
- python学习笔记——多进程中共享内存Value & Array
- linux 进程学习笔记-共享内存
- 11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)
- python自动化运维学习------使用模块psutil获取系统cpu、内存、磁盘、网络、进程等信息
- 进程学习:进程间通信(system v IPC)2.共享内存
- UNIX/LINUX编程学习之进程通信--共享内存
- Python学习笔记(二十七)多进程 (进程和线程开始)
- python学习笔记(3)-进程和线程(一)-多进程
- python学习笔记——多进程二 进程的退出
- python多进程共享内存
- [Linux学习]Linux下进程通讯之共享内存
- UNIX环境高级编程学习之第十五章进程间通信 - 两个进程通过映射普通文件实现共享内存通信
- 八周一次课(12月11日) 14.4 多进程锁 14.5 多进程共享内存
- 37. Python 多进程锁 多进程共享内存
- python多进程笔记2 - 进程间通信:队列,管道,文件,共享内存,信号量,事件,互斥锁,socket
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped
- 关于Python multiprocessing.Array创建的共享内存无法删除的问题
- SQL Server 2005 sa登录失败。已成功与服务器建立连接 但是在登录过程中发生错误。 provider 共享内存提供程序 error 0 管道的另一端上无任何进程。
- C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转
- 共享内存实现进程间大数据的交换