我可以将Python集更新分成几个线程吗?

时间:2015-01-13 09:47:43

标签: python multithreading thread-safety multiprocessing

我正在进行一些强力计算,并将结果放入集all_data。计算数据块会提供一个数字列表new_data,我想将其添加到大集合中:all_data.update(new_data)。现在,虽然计算部分很容易通过multiprocessing.Pool.map并行,但更新部分很慢。

显然,如果new_data中有两个相同的元素,all_data中不存在,并且尝试在同一时刻添加它们,则会出现问题。但是如果我们假设new_data也是一个集合,那还有问题吗?我能看到的唯一问题是集合在内存中的组织方式,所以问题是:

  

有没有办法组织一个允许同时添加元素的集合结构?如果是的话,它是用Python实现的吗?

1 个答案:

答案 0 :(得分:1)

  • 在纯Python中,没有。由于GIL,所有 Python 代码(包括内置结构的操作)都是单线程的。 GIL的存在是justified by eliminating the need to lock access to them

    • 即使在multiprocessing.Pool.map中提取的结果也已经是连续的。
  • ParallelProgramming article in SciPy wiki概述了并行代码的相关选项,但我没有直接找到与现成并发数据结构相关的内容

    • 然而,它确实提到了一些C扩展,并且在#34;高级并行化"它支持并行I / O.
  • 请注意,set实际上是hash table,其本质上无法并行更新(即使是细粒度锁定,每种类型的子操作(查找) ,插入包括碰撞解决方案)必须排序)。所以你需要

    • 将其替换为可以更好地并行化的其他数据组织,和/或
    • 加快更新操作,例如使用shared memory