python的进程间通信--共享内存教程
最近看进程间通信方式,刚好自己也在深入学习python,看到python支持共享内存。所以写下这篇笔记。
python中,有一个 multiprocessing.shared\_memory.SharedMemory类,用来创建和访问共享内存。
以下是一个例子:
创建共享内存部分,我们使用C代码,此处参考 大大飞鱼老哥的代码: https://blog.csdn.net/ababab12345/article/details/102931841
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <stdio.h>
6 #include <sys/mman.h>
7 #include <string.h>
8 #include <errno.h>
9 #include <unistd.h>
10
11 #define MMAP_DATA_SIZE 1024
12
13 int main(int argc,char * argv[])
14 {
15 char * data;
16 int fd = shm_open("/shm-file0001", O_CREAT|O_RDWR, 0777);
17
18 if (fd < 0) {
19 printf("shm_open failed!\n");
20 return -1;
21 }
22
23 ftruncate(fd, MMAP_DATA_SIZE);
24
25 data = (char*)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
26 if (!data) {
27 printf("mmap failed\n");
28 close(fd);
29 }
30
31
32 sprintf(data,"This is a share memory! %d\n",fd);
33
34 munmap(data,MMAP_DATA_SIZE);
35
36
37 close(fd);
38 getchar();
39
40 shm_unlink("/shm-file0001");
41
42 return 0;
43 }
View Code
通过xcode编译运行这段C代码:
python代码部分我们只写一个共享内存的读取:
1 from multiprocessing import shared_memory
2
3 if __name__ == '__main__':
4 existing_shm = shared_memory.SharedMemory(name='shm-file0001')
5 content = existing_shm.buf.tobytes()
6 print(content)
7 existing_shm.close()
最终python部分代码运行结果:
进一步,class multiprocessing.managers.SharedMemoryManager提供了一种比较方便的管理共享内存的方式。由SharedMemoryManager返回的sharedMemory,在sharedMemoryManager的shutdown()方法被调用后,都会自动清理掉,不用程序员再额外费心了。