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

如何在dataclass中使用multiprocessing.Value?解决类型无大小报错

在dataclass中使用multiprocessing.Value的问题解决

你遇到的TypeError: this type has no size是因为两个核心问题:

  • multiprocessing.Value要求第一个参数是ctypes类型(如ctypes.c_int)或对应类型码(如'i'),而非Python原生的int类型,ctypes无法识别原生int的内存大小。
  • 在dataclass字段的默认值中直接调用multiprocessing.Value,会在类定义阶段创建共享变量,导致所有类实例共享同一个共享内存对象,不符合多数场景的预期。

正确实现方式

方案一:用default_factory创建独立实例

import multiprocessing
import ctypes
from dataclasses import dataclass, field

@dataclass
class TestResults:
    count: multiprocessing.sharedctypes.Synchronized[int] = field(
        default_factory=lambda: multiprocessing.Value(ctypes.c_int, 0)
    )
  • default_factory会在每个类实例初始化时,单独创建新的共享变量,避免实例间共享。
  • 类型注解Synchronized[int]是Python 3.9+的精确写法,旧版本可直接写multiprocessing.sharedctypes.Synchronized。

方案二:通过__post_init__初始化

import multiprocessing
import ctypes
from dataclasses import dataclass

@dataclass
class TestResults:
    count: multiprocessing.sharedctypes.Synchronized[int] | None = None

    def __post_init__(self):
        if self.count is None:
            self.count = multiprocessing.Value(ctypes.c_int, 0)

这种方式适合需要根据其他字段动态初始化共享变量的场景。

使用注意事项

  • 访问共享变量的值时,要通过.value属性操作,比如test_results.count.value += 1。
  • 如果不需要内置锁,可以改用multiprocessing.RawValue,但需自行处理多进程同步问题。

内容的提问来源于stack exchange,提问作者gbajson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:01:09