代码之家  ›  专栏  ›  技术社区  ›  fmark

Python中的并行性

  •  22
  • fmark  · 技术社区  · 14 年前

    在Python中实现并行的选项有哪些?我想在一些非常大的光栅上执行一系列CPU受限的计算,并希望将它们并行化。我有C语言背景,熟悉三种并行方法:

    1. 消息传递过程,可能分布在集群中,例如。 .
    2. 显式共享内存并行,使用 叉子() , 管道() ,等
    3. OpenMP接口 .

    MPI公司 吉尔 ,以及引用 任务表 .

    简而言之,在选择Python中不同的并行化策略之前,我需要知道什么?

    5 回复  |  直到 14 年前
        1
  •  14
  •   Will    14 年前

    一般来说,您描述的是CPU限制的计算。这不是Python的强项。历史上,两者都不是多重处理。

    主流Python解释器中的线程被可怕的全局锁控制。新的 multiprocessing API解决了这个问题,并提供了一个带有管道和队列等的工作池抽象。

    您可以使用 C Cython ,并使用Python作为胶水。

        2
  •  6
  •   Edward Dale    14 年前

    新的(2.6) multiprocessing 吉尔 问题。它还抽象掉了一些本地/远程问题,因此稍后可以选择在本地运行代码还是分散在集群上运行代码。我在上面链接的文档是一个很好的咀嚼,但应该提供一个良好的基础开始。

        3
  •  4
  •   Robert Nishihara    5 年前

    Ray

    并行化Python函数的最基本策略是用 @ray.remote 装饰工。然后可以异步调用它。

    import ray
    import time
    
    # Start the Ray processes (e.g., a scheduler and shared-memory object store).
    ray.init(num_cpus=8)
    
    @ray.remote
    def f():
        time.sleep(1)
    
    # This should take one second assuming you have at least 4 cores.
    ray.get([f.remote() for _ in range(4)])
    

    您还可以使用 actors 装饰工。

    # This assumes you already ran 'import ray' and 'ray.init()'.
    
    import time
    
    @ray.remote
    class Counter(object):
        def __init__(self):
            self.x = 0
    
        def inc(self):
            self.x += 1
    
        def get_counter(self):
            return self.x
    
    # Create two actors which will operate in parallel.
    counter1 = Counter.remote()
    counter2 = Counter.remote()
    
    @ray.remote
    def update_counters(counter1, counter2):
        for _ in range(1000):
            time.sleep(0.25)
            counter1.inc.remote()
            counter2.inc.remote()
    
    # Start three tasks that update the counters in the background also in parallel.
    update_counters.remote(counter1, counter2)
    update_counters.remote(counter1, counter2)
    update_counters.remote(counter1, counter2)
    
    # Check the counter values.
    for _ in range(5):
        counter1_val = ray.get(counter1.get_counter.remote())
        counter2_val = ray.get(counter2.get_counter.remote())
        print("Counter1: {}, Counter2: {}".format(counter1_val, counter2_val))
        time.sleep(1)
    

    它有许多优点 multiprocessing

    Ray 是我一直在帮助开发的一个框架。

        4
  •  1
  •   pygabriel    14 年前

    类似的结果可以通过 parallel python 另外,它还设计用于集群。

        5
  •  1
  •   Mattias Nilsson    14 年前

    根据需要处理多少数据以及要使用多少CPU/机器,在某些情况下,最好用C编写一部分数据(如果要使用jython/IronPython,则用Java/C)

    从中获得的加速可能比在8个cpu上并行运行更有助于提高性能。