八周一次课(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
相关文章推荐
- python学习—Day41—多进程锁与多进程共享内存
- 37. Python 多进程锁 多进程共享内存
- linux C++ 进程间共享内存以及临界区的实现
- 共享内存,多进程间共享结构体
- 进程IPC---共享内存
- SQL2008R2 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)
- windows编程之进程通信:内存共享
- linux进程间的通信(C): 共享内存
- Qt进程间共享内存例子
- 一次jvm进程内存泄露问题的处理
- VC中进程与进程之间共享内存
- 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
- Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存
- 进程内存共享的方法
- C# 进程间共享内存通信方式
- 静态库与共享库的区别、进程、操作系统、内存
- 关于登录sql server 2005 出现“已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程”的问题
- 进程间的通信--(三)共享内存
- linux下的多进程通信(IPC)原理及实现方案(管道、队列、信号量、共享内存)
- PostgreSQL启动过程中的那些事七:初始化共享内存和信号十:shmem中初始化PROC索引、辅助进程和信号