zoukankan      html  css  js  c++  java
  • 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!
    ");
    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
    ");
    28         close(fd);
    29     }
    30     
    31     
    32     sprintf(data,"This is a share memory! %d
    ",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()方法被调用后,都会自动清理掉,不用程序员再额外费心了。

  • 相关阅读:
    homebrew 安装 mpv
    Spring JdbcTemplate 两种方法的区别
    git .gitignore失效的解决办法
    git 分支修改bug应用场景
    url编码实践
    escape encodeuri encodeURIComponent 区别
    mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by
    服务器病毒问题解决- 阿里云 挖矿病毒,Circle_MI.png
    trim和replace的陷阱实践
    mysql 5.7.15 union order by 子查询排序不生效
  • 原文地址:https://www.cnblogs.com/leipei2352/p/14635264.html
Copyright © 2011-2022 走看看