我有一组对象状态比我认为以1:1为基础进行线程或处理是合理的,让我们说它看起来像这样
class SubState(object):
def __init__(self):
self.stat_1 = None
self.stat_2 = None
self.list_1 = []
class State(object):
def __init__(self):
self.my_sub_states = {'a': SubState(), 'b': SubState(), 'c': SubState()}
我想要做的是让每个sub_states
到self.my_sub_states
密钥共享,并通过抓取整个子状态的单个锁来访问它们 - 即{{ 1}}等等,然后在我完成后释放它。是否有一个类我可以继承以使用单个Lock共享整个SubState对象?
实际进程工作者将从self.locks={'a': multiprocessing.Lock(), 'b': multiprocessing.Lock()
中提取任务(我无法将sub_states作为args传递给进程,因为他们在获得下一个任务之前不知道他们需要哪个sub_state)。
答案 0 :(得分:1)
作为multiprocessing
docs state,您实际上只有两个选项可以在multiprocessing.Process
个实例之间实际共享状态(至少不需要第三方选项 - 例如redis):
Manager
multiprocessing.sharedctypes
Manager
将允许您共享纯Python对象,但正如您所指出的,对这种共享对象的读写访问速度非常慢。
multiprocessing.sharedctypes
将使用实际共享内存,但您仅限于共享ctypes
个对象。因此,您需要将SubState
对象转换为ctypes.Struct
。另外值得注意的是,每个multiprocessing.sharedctypes
对象都有自己的内置锁,因此您可以通过在操作之前显式获取该锁来同步对每个对象的访问。