在不同的目录中工作(os.chdir公司)同时(平行线程)

2024-10-02 12:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想同步我所有的vcs目录并行。我将使用目录并运行特殊的命令行脚本来同步git或mercurial存储库。这是一个缓慢的过程,所以我想让它平行。在

但是我的并行线程为“当前目录”而斗争有麻烦,所以我需要一些技巧来同时在不同的目录中工作。在

当前解决方案:

def syncrepos(repos):
  for r in repos.split("\n"):
    if r:
      print("------ repository: ", r)
      thrd = ThreadingSync(r)
      thrd.setDaemon(True)
      thrd.start()

ThreadingSync在哪里

^{pr2}$

并且gitSync

def gitSync(): 
  pretty(cmd("git pull origin master"))
  pretty(cmd("git fetch upstream master"))
  pretty(cmd("git pull --rebase upstream master"))
  pretty(cmd("git push -f origin master"))

当然,这不是完美的,但它做我的工作,我想加快它。在

如何为每个存储库/目录生成一个子进程(Thrad safe实现os.chdir公司) ? 在


Tags: 命令行gitmaster目录cmddefprettyorigin
1条回答
网友
1楼 · 发布于 2024-10-02 12:24:31

创建一个工作线程池以运行子例程:

http://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers

在你的情况下,可能是:

from multiprocessing import Pool
import os

def gitSync(repo):
    print "I am", repo, "and my cwd is:", os.getcwd()
    os.chdir(repo)
    print "I am", repo, "and my cwd is:", os.getcwd()

if __name__ == '__main__':
    dir = os.getcwd()
    repos = [item for item in os.listdir(dir) if os.path.isdir(os.path.join(dir, item))]
    print repos
    pool = Pool(maxtasksperchild=1)
    pool.map(gitSync, repos)
    pool.close()
    pool.join()

请注意,池可能会使调试变得有点困难,因为父节点通常不会显示太多信息(我的一个孩子死了),所以先让它单线程工作。在

编辑: 好吧,这很有趣-注意Pool maxtasksperchild=1的新参数。进程在两次调用之间不是rebooted,因此当您在一次调用中更改目录时,当该进程得到重用时,您仍然在该目录中。在这里,我只需告诉池在每次调用后终止进程就可以解决这个问题。在

^{pr2}$

相关问题 更多 >

    热门问题