【问题标题】:Multi Processing for loop循环多处理
【发布时间】:2017-07-14 14:24:06
【问题描述】:

我正在尝试创建一个脚本来克隆存储库,然后从本地存储库中删除写访问权限。我有一个存储 repo 对象的列表,我遍历此列表以克隆和锁定 repo。

我尝试使用multiprocessing 来加快这项任务,但它似乎实际上减慢了它的速度......

def install():
    os.chdir(ROOT_DIR)
    if os.path.isdir("./repos"):
        for repo in getRepos():
            os.chdir(ROOT_DIR)
            #Process(target=repo.clone()).start()
            #Process(target=lock, args=(repo,)).start()
            repo.clone()
            lock(repo)
    else:
        os.mkdir("./repos")
        install()

注释的两行是我尝试创建的子进程。我用错了吗?

通过子处理,我的平均执行时间是:5.8 秒 如果没有子处理,我的平均执行时间是:4.5 秒。

【问题讨论】:

  • 您在每次循环迭代中创建进程,每个进程将仅在一个 repo 上工作。理想情况下,您希望委派一个小组来处理其中的一部分。下面的答案为您解决了这个问题,但没有解释它的作用。

标签: python multithreading subprocess


【解决方案1】:

尝试类似:

from multiprocessing import Pool

def processRepo(repo):
    repo.clone()
    lock(repo)


def install():
    os.chdir(ROOT_DIR)
    if os.path.isdir("./repos"):
        pool = Pool()
        pool.map(processRepo, getRepos())
        pool.close()
        pool.join()
    else:
        os.mkdir("./repos")
        install()

【讨论】:

  • 这很好并且可能有效。但是对你正在做的事情的解释肯定会帮助 OP 和未来的读者。另外,包括from multiprocessing import Pool
  • 完美!这使执行时间达到了 3.4 秒左右,为什么我不必将 repo 参数传递给 processRepo?
  • @APorter1031:因为pool.map().
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
  • 2021-12-12
  • 2013-12-10
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多