4

すべての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"))

確かにこれは完璧ではありませんが、それは私の仕事をします、そして私はそれをスピードアップしたいと思います。

リポジトリ/ディレクトリごとに1つのサブプロセスを生成する方法(os.chdirのThradセーフ実装)?

4

1 に答える 1

5

サブルーチンを実行するためのワーカーのプールを作成します。

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()

プールはデバッグを少し難しくする可能性があることに注意してください。親は通常、-私の子の1人が死亡した-以上のことを明らかにしないので、最初にシングルスレッドで動作させます。

編集:それは感謝するのが面白かったです-プールへの新しい議論に注意してくださいmaxtasksperchild=1。プロセスはrebooted呼び出しの間にないため、1回の呼び出しでディレクトリを変更しても、プロセスが再利用されるときはそのディレクトリにとどまります。ここでは、呼び出しのたびにプロセスを強制終了するようにプールに指示するだけで、問題を解決しました。

john:captcrunch john$ python foo.py 
['.git', '.idea', 'fixtures', 'lib', 'obj', 'raw', 'tests']
I am .git and my cwd is: /Users/john/code/linz/src/captcrunch
I am .git and my cwd is: /Users/john/code/linz/src/captcrunch/.git
I am .idea and my cwd is: /Users/john/code/linz/src/captcrunch
I am .idea and my cwd is: /Users/john/code/linz/src/captcrunch/.idea
I am fixtures and my cwd is: /Users/john/code/linz/src/captcrunch
I am fixtures and my cwd is: /Users/john/code/linz/src/captcrunch/fixtures
I am lib and my cwd is: /Users/john/code/linz/src/captcrunch
I am lib and my cwd is: /Users/john/code/linz/src/captcrunch/lib
I am obj and my cwd is: /Users/john/code/linz/src/captcrunch
I am obj and my cwd is: /Users/john/code/linz/src/captcrunch/obj
I am raw and my cwd is: /Users/john/code/linz/src/captcrunch
I am raw and my cwd is: /Users/john/code/linz/src/captcrunch/raw
I am tests and my cwd is: /Users/john/code/linz/src/captcrunch
I am tests and my cwd is: /Users/john/code/linz/src/captcrunch/tests
于 2012-12-07T06:45:00.457 に答える