我开发了一个工具来实现多线程或多进程环境的共享原子性。
借助多处理/多线程共享ctypes,我们实现了共享变量和数组。但是同步可以通过锁来实现。这个包提供了第二种方式来访问那些具有原子操作的原始 ctypes。可以在python 3.0以上版本使用到最新的3.11
要求,
Linux/MacOSX
该软件包需要在 Linux 平台上安装 libatomic
cffi ==1.15 在 Linux/MacOSX 平台上编译通过
gcc >= 4.8 以包含原子 API。
窗户
待定
安装
要安装 shared_atomic,请使用 pip:
pip install shared_atomic
用法
使用 ctypes 加载已编译的 .so 文件
import ctypes
atomic = ctypes.CDLL(‘shared_atomic.cpython-36m-darwin.so’)
在多线程情况下:
#get pointer address by ctypes.byref
v = ctypes.c_size_t(2 ** 63 - 1)
vref = ctypes.byref(v)
#start multiple threads
threadlist=[]
for i in range(10000):
threadlist.append(Thread(target=atomic.size_t_sub_and_fetch, args=(vref, ctypes.c_size_t(100))))
for i in range(10000):
threadlist[i].start()
for i in range(10000):
threadlist[i].join()
在多重加工条件下:
#get pointer address by ctypes.byref
v = multiprocessing.Value(ctypes.c_size_t, 2 ** 63 - 1, lock=False)
vref = ctypes.byref(v)
#start multiple processes
processlist = []
for i in range(10000):
processlist.append(Process(target=atomic.size_t_sub_and_fetch, args=(vref, ctypes.c_size_t(100))))
for i in range(10000):
processlist[i].start()
for i in range(10000):
processlist[i].join()
目前
concurrent.futures.ProcessPoolExecutor
和
concurrent.futures.ThreadPoolExecutor
不能用于启动多次执行,因为cdll函数不能被pickle序列化。
源代码仓库:
https://github.com/irvinren/shared_atomic.git
https://gitee.com/irvinren/shared_atomic.git
有关文档,请访问:
https://shared-atomic.readthedocs.io/en/latest/
该项目在 GPL v3.0 下获得许可