You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:05:54