【问题标题】:Parallelize this code并行化这段代码
【发布时间】:2018-03-29 21:03:12
【问题描述】:

我正在尝试弄清楚如何并行化以下代码。 我查找了 joblibconcurrent.futuresmultiprocessing 模块,但我一生都无法通过阅读文档和搜索 SO/google 来弄清楚它们是如何工作的。

Grid 是一个定义了适当方法的类对象,处理循环的顺序无关紧要。

def ProcessGrid(Grid):
    #Parallel This Loop
    for i in range(len(Grid)):
        Grid[i].AdjustCostMultiplier()
        Grid[i].FindAllNeighbours(Grid)
        print("Processing Grid Cell: " + str(i) + " of " + str(len(Grid)),end = "\r")
    #Return to serial
    return Grid

【问题讨论】:

  • 是否要并行调用 ProcessGrid 方法 2 次?还是您想调用 AdjustCostMultiplier() 和 FindAllNeighbours()?
  • 我想并行化 for 循环,我将编辑我的问题以反映澄清
  • “为我做 X”请求(很难将它们描述为“问题”)在这里往往不会得到很好的回应,至少要表现出你自己的努力——不仅仅是断言你尝试过,但实际上以minimal reproducible example 的形式显示了您编写的代码并描述了它是如何失败的。
  • 好的,我添加了一个答案。我没有测试它,但它应该可以工作:)

标签: python multithreading parallel-processing multiprocessing concurrent.futures


【解决方案1】:

你可以像这样使用线程库:

import threading

def process(grid, i):
    grid[i].AdjustCostMultiplier()
    grid[i].FindAllNeighbours(Grid)
    print("Processing Grid Cell: " + str(i) + " of " + str(len(grid)), end = "\r")

def ProcessGrid(Grid):
    threads = []
    for i in range(len(Grid)):
        t = threading.Thread(target=process, args=(Grid, i))
        t.start()
        threads.append(t)
    for t in threads:
        # Wait for all threads to finish
        t.join()
    #Return to serial
    return Grid

process() 将在每次迭代的新线程中调用。 t.join() 然后等待线程完成。

【讨论】:

  • Python 多线程在受 CPU 限制时不会使代码更快,不幸的是,因为全局解释器锁。多处理确实使它更快,但需要更多的努力。
  • 他要求将其并行化。他从来没有要求让他的代码更快。如果涉及等待进程,多线程也可以使代码更快。
  • t 为 "NoneType" 存在一些问题(我猜是因为没有 return 语句?),但我只是注释掉了 join 语句,它对我的​​情况很好
  • 哎呀,抱歉我修好了。我将 .start() 存储到 t 而不是线程本身。只需将 t.start() 移到下面的行中。
  • @Maarten_vd_Sande 如果 (a) 不受 CPU 限制,或者 (b) 受 CPU 限制,并行化可以使代码更快。但大部分工作都在 C 扩展库中,这些库为主要操作(如 numpy)发布 GIL,或者 (c) 它在 Jython 等无 GIL 的 Python 解释器中运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
相关资源
最近更新 更多