如何在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
相关产品推荐
相关产品推荐

