我正在进行一些强力计算,并将结果放入集all_data
。计算数据块会提供一个数字列表new_data
,我想将其添加到大集合中:all_data.update(new_data)
。现在,虽然计算部分很容易通过multiprocessing.Pool.map
并行,但更新部分很慢。
显然,如果new_data
中有两个相同的元素,all_data
中不存在,并且尝试在同一时刻添加它们,则会出现问题。但是如果我们假设new_data
也是一个集合,那还有问题吗?我能看到的唯一问题是集合在内存中的组织方式,所以问题是:
有没有办法组织一个允许同时添加元素的集合结构?如果是的话,它是用Python实现的吗?
答案 0 :(得分:1)
在纯Python中,没有。由于GIL,所有 Python 代码(包括内置结构的操作)都是单线程的。 GIL的存在是justified by eliminating the need to lock access to them。
multiprocessing.Pool.map
中提取的结果也已经是连续的。ParallelProgramming article in SciPy wiki概述了并行代码的相关选项,但我没有直接找到与现成并发数据结构相关的内容
请注意,set
实际上是hash table,其本质上无法并行更新(即使是细粒度锁定,每种类型的子操作(查找) ,插入包括碰撞解决方案)必须排序)。所以你需要