【发布时间】:2012-11-25 07:34:11
【问题描述】:
我想并行同步我所有的 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 在哪里
class ThreadingSync(threading.Thread):
def __init__(self, repo):
threading.Thread.__init__(self)
self.repo = repo
def run(self):
r = self.repo.split("-t")
path = (r[0]).strip()
if len(r) < 2:
vcs = VCS.git
else:
vcs = {
'git' : VCS.git,
'git git' : VCS.git_git,
'git hg' : VCS.git_mercurial,
'git svn' : VCS.git_subversion,
'git vv' : VCS.git_veracity,
'hg hg' : VCS.hg_hg}[(r[1]).strip()]
os.chdir(path)
if vcs == VCS.git:
checkGitModifications()
gitSync()
... etc
而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"))
当然,这并不完美,但它完成了我的工作,我想加快速度。
如何为每个存储库/目录生成一个子进程(os.chdir 的安全实现)?
【问题讨论】:
-
有什么问题?您的代码相当不透明。到目前为止,我最好的建议是(a)考虑多处理模块而不是线程模块 - 它可能更容易开始,并且(b)为每个存储库/目录生成一个子进程,这样你就不必担心他们会互相绊倒。
-
@John Mee“为每个存储库/目录生成一个子进程” - 这就是我所需要的,这就是问题的全部内容。怎么办?
-
@John Mee os.chdir(path) 在我的 Threading 类中,但它仍在影响其他进程,以为 os.chrdir 会影响一些全局变量,但如何处理呢?
-
你是说当你在子进程中改变目录时,当前目录在所有子进程中都会改变?有趣 :-) 那么完整的路径呢?
-
完整路径将无法正常工作......我需要线程安全的 os.chdir 替代方案......我想。
标签: python multithreading parallel-processing directory multiprocessing