Python3如何跨平台用multiprocessing.Array共享hash()输出的64位整数?
跨平台Python多进程共享64位整数的替代方案
方案1:用multiprocessing.Value/Array指定明确类型码
直接使用Python标准的类型码强制指定64位整数类型,避开平台相关的long定义差异:
'q':带符号64位整数(对应C语言的int64_t)'Q':无符号64位整数(对应C语言的uint64_t)
示例代码:
import multiprocessing def worker(shared_arr): shared_arr[0] = 1234567890123456 print(f"Worker modified value: {shared_arr[0]}") if __name__ == "__main__": # 创建包含2个带符号64位整数的共享数组 shared_arr = multiprocessing.Array('q', [0, 0]) p = multiprocessing.Process(target=worker, args=(shared_arr,)) p.start() p.join() print(f"Main process reads value: {shared_arr[0]}")
方案2:使用multiprocessing.shared_memory(Python 3.8+)
借助共享内存对象直接操作内存区域,配合struct模块完成64位整数的打包/解包,完全跨平台兼容:
import multiprocessing import struct from multiprocessing import shared_memory def worker(shm_name): shm = shared_memory.SharedMemory(name=shm_name) # 读取共享内存中的64位整数 val = struct.unpack('q', shm.buf[:8])[0] val += 1000000000000000 # 将修改后的值写回共享内存 shm.buf[:8] = struct.pack('q', val) shm.close() if __name__ == "__main__": # 创建8字节的共享内存(刚好存储一个64位整数) shm = shared_memory.SharedMemory(create=True, size=8) # 初始化共享内存的值 initial_val = 9876543210987654 shm.buf[:8] = struct.pack('q', initial_val) p = multiprocessing.Process(target=worker, args=(shm.name,)) p.start() p.join() # 读取修改后的最终值 final_val = struct.unpack('q', shm.buf[:8])[0] print(f"Initial value: {initial_val}, Final value: {final_val}") shm.close() shm.unlink()
方案3:结合ctypes类型创建共享数组
用ctypes提供的明确64位类型替代平台相关的默认类型,确保跨平台行为一致:
import multiprocessing import ctypes def worker(shared_arr): shared_arr[1] = -9876543210987654 print(f"Worker set value: {shared_arr[1]}") if __name__ == "__main__": # 创建包含3个int64类型的共享数组 shared_arr = multiprocessing.Array(ctypes.c_int64, [0, 0, 0]) p = multiprocessing.Process(target=worker, args=(shared_arr,)) p.start() p.join() print(f"Main reads value: {shared_arr[1]}")
以上方案均无需使用multiprocessing.Manager,也不需要手动操作指针,可直接在Linux和Windows平台实现64位整数的多进程共享。
内容的提问来源于stack exchange,提问作者H.Sheng
相关产品推荐
相关产品推荐

