python-3.x 如何在数据类中使用多线程.Value?

x4shl7ld  于 2022-12-14  发布在  Python
关注(0)|答案(1)|浏览(161)

你们中有人知道是否可以在dataclass中使用multiprocessing.Value字段吗?
对于下面的数据类定义,我得到了TypeError: this type has no size异常。

import multiprocessing
from dataclasses import dataclass

@dataclass
class TestResults:
    count: multiprocessing.sharedctypes.Synchronized = multiprocessing.Value(int, 0)

堆栈跟踪:

$ python example.py 
Traceback (most recent call last):
  File "/tmp/example.py", line 5, in <module>
    class TestResults:
  File "/tmp/example.py", line 6, in TestResults
    count: multiprocessing.sharedctypes.Synchronized = multiprocessing.Value(int, 0)
  File "/usr/lib/python3.10/multiprocessing/context.py", line 135, in Value
    return Value(typecode_or_type, *args, lock=lock,
  File "/usr/lib/python3.10/multiprocessing/sharedctypes.py", line 74, in Value
    obj = RawValue(typecode_or_type, *args)
  File "/usr/lib/python3.10/multiprocessing/sharedctypes.py", line 49, in RawValue
    obj = _new_value(type_)
  File "/usr/lib/python3.10/multiprocessing/sharedctypes.py", line 40, in _new_value
    size = ctypes.sizeof(type_)
TypeError: this type has no size
shyt4zoc

shyt4zoc1#

multiprocessing.Value需要第一个参数作为数组类型,因此对于int,应该传入“i”表示2字节整数,或者“l”表示4字节整数。
由于它是一个可变类型,因此需要使用field(default_factory)构造它。

import multiprocessing
from dataclasses import dataclass, field
import multiprocessing.sharedctypes

@dataclass
class TestResults:
    count: multiprocessing.sharedctypes.Synchronized = field(default_factory=lambda: multiprocessing.Value('i', 0))

相关问题