原文地址:

http://xiaorui.cc/archives/3290

============================================================

摘抄内容:

接着粗略的聊聊multiprocessing共享内存的实现方法.

multiprocessing提前设定的ctypes映射表,这样对你来说只需要传递符号就可以了。

typecode_to_type = {
'c': ctypes.c_char, 'u': ctypes.c_wchar,
'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
}

下面的代码通过mmap ctypes实现了一个简单的数据共享, 这样对于我们来说,可以像操作python对象那样操作映射的内存地址

(经过修改后的Python3.7代码)

###  a.py

import ctypes
import mmap
import os
import struct
import time def main():
fd = os.open('/tmp/mmaptest', os.O_CREAT | os.O_TRUNC | os.O_RDWR) assert os.write(fd, b'\x00' * mmap.PAGESIZE) == mmap.PAGESIZE buf = mmap.mmap(fd, 0, mmap.MAP_SHARED, mmap.PROT_WRITE) i = ctypes.c_int.from_buffer(buf) # Before we create a new value, we need to find the offset of the next free
# memory address within the mmap
# print(offset, ctypes.sizeof(i)) # byte length
offset = struct.calcsize(i._type_) # The offset should be uninitialized ('\x00')
#assert buf[offset] == b'\x00'
#print(type(buf[offset]))
assert buf[offset] == 0x00 # Now ceate a string containing 'foo' by first creating a c_char array
s_type = ctypes.c_char * len('foot') # Now create the ctypes instance
s = s_type.from_buffer(buf, offset) s.raw = b'foot'
i.value = 10 i.value *= i.value
print( 'Changing i : {}'.format(i.value) ) s.raw = b'bara'
print( 'Changing s : {}'.format(s.raw) ) if __name__ == '__main__':
main() time.sleep(60)

运行结果:

### b.py

import mmap
import os
import struct
import time def main():
# Open the file for reading
fd = os.open('/tmp/mmaptest', os.O_RDONLY) # Memory map the file
buf = mmap.mmap(fd, 0, mmap.MAP_SHARED, mmap.PROT_READ) i = None
s = None new_i, = struct.unpack('i', buf[:4])
new_s, = struct.unpack('4s', buf[4:8]) if i != new_i or s != new_s:
print( 'i: %s => %d' % (i, new_i) )
print( 's: %s => %s' % (s, new_s) )
i = new_i
s = new_s if __name__ == '__main__':
main()

运行结果:

(摘抄) 源码分析multiprocessing的Value Array共享内存原理的更多相关文章

  1. SpringMVC源码分析6:SpringMVC的视图解析原理

    title: SpringMVC源码分析6:SpringMVC的视图解析原理 date: 2018-06-07 11:03:19 tags: - SpringMVC categories: - 后端 ...

  2. Libev源码分析08:Libev中的内存扩容方法

    在Libev中,如果某种结构的数组需要扩容,它使用array_needsize宏进行处理,比如: array_needsize (int, fdchanges, fdchangemax, fdchan ...

  3. Linux进程调度与源码分析(三)——do_fork()的实现原理

    用户层的fork(),vfork(),clone()API函数在执行时,会触发系统调用完成从用户态陷入到内核态的过程,而上述函数的系统调用,最终实现都是通过内核函数do_fork()完成,本篇着重分析 ...

  4. spark2.1源码分析4:spark-network-common模块的设计原理

    spark-network-common模块底层使用netty作为通讯框架,可以实现rpc消息.数据块和数据流的传输. Message类图: 所有request消息都是RequestMessage的子 ...

  5. jQuery.lazyload使用及源码分析

    前言: 貌似以前自己也写过图片懒加载插件,但是新公司使用的是jQuery.lazyload插件,为了更好的运用,自己还是把源码看了遍,分别记录了如何使用, 插件原理,各个配置属性的完整解释,demo实 ...

  6. YYCache 源码分析(一)

    iOS 开发中总会用到各种缓存,YYCache或许是你最好的选择.性能上有优势,用法也很简单.作者ibireme曾经对比过同类轮子:http://blog.ibireme.com/2015/10/26 ...

  7. netty(六) buffer 源码分析

    问题 : netty的 ByteBuff 和传统的ByteBuff的区别是什么? HeapByteBuf 和 DirectByteBuf 的区别 ? HeapByteBuf : 使用堆内存,缺点 ,s ...

  8. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  9. jquery2源码分析系列

    学习jquery的源码对于提高前端的能力很有帮助,下面的系列是我在网上看到的对jquery2的源码的分析.等有时间了好好研究下.我们知道jquery2开始就不支持IE6-8了,从jquery2的源码中 ...

  10. [转]jQuery源码分析系列

    文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...

随机推荐

  1. Vue学习:14.工程化开发&脚手架

    0基础如何进入IT行业? 简介:对于没有任何相关背景知识的人来说,如何才能成功进入IT行业?是否有一些特定的方法或技巧可以帮助他们实现这一目标? 方向一:学习路径 1.明确兴趣和目标:首先确定你对IT ...

  2. 重学前端 - react 项目第一节:创建react 项目

    重学前端 - react 项目第一节:创建react 项目 简介:之前一直使用的都是 vue 全家桶开发项目,现在在新的项目上开始使用react开发. 现在开始在重新学习一下 react 相关技术. ...

  3. vue2 实现可拖拽悬浮球

    实现效果 相关代码 点击查看代码 <template> <div class="float-box"> <div class="button ...

  4. python安装pywifi

    1.Windows安装: 在Dos窗口中输入以下命令: pip install pywifi 如果找不到pip命令,那么需要将Python安装文件夹下Scripts文件夹的绝对路径加入环境变量中. 2 ...

  5. CF1854E Games Bundles

    乱搞题 设个 \(dp[i]\) 表示和为 \(i\) 的子序列个数,那么转移是容易的, \(dp[j]+=dp[j-i]\) ,然后就判下 \(dp[60]+dp[60-i]\) 是否大于 \(m\ ...

  6. ZYNQ:使用SDK打包BOOT.BIN、烧录BOOT.BIN到QSPI-FLASH

    打包程序为BOOT.BIN 注意,做好备份是一个好习惯. Vivado Vivado 添加QSPI Flash的IP,重新编译: Launch SDK(推荐方法):或者用SDK指定一个workspac ...

  7. supervisor 安装和基本使用

    安装 yum install supervisor touch /var/run/supervisor/supervisor.sock chmod 777 /var/run/supervisor/su ...

  8. [UG 二次开发 python] 导出BOM表(包含图片)

    只导出最底层的零件,零件的属性已经设置好,零件的截图生成后,放在零件的同一个文件夹下 用到了 xlsxwriter # nx: threaded # 导出BOM表 __version__ = &quo ...

  9. python跟踪脚本运行过程(类似bash shell -x)

    #详细追踪 python -m trace --trace pyscript.py #显示调用了哪些函数 python -m trace --trackcalls pyscript.py

  10. React Lazy 和 Suspense

    在React应用中,有些组件可能不经常用到,比如法律条款的弹窗,我们几乎不看,这些组件也就没有必要首次加载,可以在点击它们的时候再加载,这就需要动态引入组件,需要组件的时候,才引入组件,加载它们,进行 ...