【问题标题】:Can I separate Python set update into several threads?我可以将 Python 集更新分成几个线程吗?
【发布时间】:2015-01-13 09:47:42
【问题描述】:

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

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

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

【问题讨论】:

  • multiprocessing 提供用于共享数据和同步的原语。看看this

标签: python multithreading thread-safety multiprocessing


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

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

    • 不过,它确实在“复杂的并行化”下提到了一些支持并行 I/O 的 C 扩展。
  • 请注意,set 实际上是 hash table,其本质上不能并行更新(即使使用细粒度锁定、每种类型的子操作(查找、插入,包括冲突解决))必须排序)。所以你需要

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2023-02-17
    • 1970-01-01
    • 2013-01-03
    • 2019-12-20
    相关资源
    最近更新 更多