paralellizing svn up导致客户端冻结

the*_*orn 5 python svn windows

我正在编写一个svn up并行运行的程序,它导致机器冻结.发生这种情况时,服务器没有遇到任何负载问题.

该命令使用运行ThreadPool.map()subprocess.Popen():

def cmd2args(cmd):
    if isinstance(cmd, basestring):
        return cmd if sys.platform == 'win32' else shlex.split(cmd)
    return cmd

def logrun(cmd):
    popen = subprocess.Popen(cmd2args(cmd),
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT,
                             cwd=curdir,
                             shell=sys.platform == 'win32')
    for line in iter(popen.stdout.readline, ""):
        sys.stdout.write(line)
        sys.stdout.flush()

...
pool = multiprocessing.pool.ThreadPool(argv.jobcount)
pool.map(logrun, _commands)
Run Code Online (Sandbox Code Playgroud)

argv.jobcountmultiprocessing.cpu_count()运行的作业的较小者和数量(在这种情况下是4). _commands是一个字符串列表,其中包含下面列出的命令. 在Windows上shell设置为Trueshell,因此shell可以找到可执行文件,因为Windows没有which命令,并且在Windows上查找可执行文件有点复杂(以前的命令cd directory&&svn up ..也需要,shell=True但现在已经完成了cwd参数代替).

正在运行的命令是

  svn up w:/srv/lib/dktabular
  svn up w:/srv/lib/dkmath
  svn up w:/srv/lib/dkforms
  svn up w:/srv/lib/dkorm
Run Code Online (Sandbox Code Playgroud)

其中每个文件夹是一个单独的项目/存储库,但存在于同一个Subversion服务器上.该svn可执行文件是一个与TortoiseSNV 1.8.8(建立25755 - 64位)进行包装.代码是最新的(即svn up无操作).

当客户端冻结时,任务管理器中的内存条首先变为空白:

涂黑内存条

有时一切都会变暗

冻结的

如果我等待一段时间(几分钟),机器最终会回来.

Q1:svn并行调用是否是copacetic ?

Q2:是否有与我如何使用的任何问题ThreadPool.map()subprocess.Popen()

问题3:是否有任何工具/策略可用于调试这些问题?

小智 0

我将尽我所能彻底回答这三个问题,并欢迎对我的发言进行更正。

Q1:并行调用svn是否很麻烦?

Copacet,这有待确定,但我想说,既不推荐也不不推荐。通过该声明,源代码控制工具具有需要进程和块级(最佳猜测)锁定的特定功能。校验和、文件传输和文件读/写需要锁定才能正确处理,否则您将面临重复工作和文件争用的风险,这将导致进程失败。

ThreadPool.map()Q2:我使用and的方式有什么问题吗subprocess.Popen()

虽然我不知道它的绝对细节,subprocess.Popen()因为我上次在 2.6 中使用它,但我可以谈谈可编程性。您在创建的代码中所做的是创建一个特定子进程的池,而不是直接调用进程。现在我的想法是,根据我的理解,ThreadPool()它默认情况下不执行锁定。subprocess.Popen()我不确定这可能会导致问题。关于我上面的回答,锁定是需要实现的。我建议查看/sf/answers/213123851/以更好地理解线程和池之间的差异,因为我建议使用线程而不是多处理。由于源代码控制应用程序需要锁定的性质,如果您要在处理锁定时并行操作,您还需要能够同步线程,以便不重复工作。几个月前,我在 Linux 上进行了一次多处理测试,我注意到 grep 正在重复全局搜索。我看看能否找到我写的代码并粘贴它。通过线程同步,我希望Python能够以svn能够理解的方式在线程之间传递svn线程状态,这样就不会发生进程重复。话虽如此,我不知道 svn 在这方面是如何工作的,所以我只是推测/做出最好的猜测。由于 svn 可能使用相当复杂的锁定方法(我会断言块级锁定而不是 inode 锁定,但再一次,最好的猜测),因此实现信号量锁定而不是 or 可能是有意义lock()Rlock()。也就是说,您必须仔细检查并测试各种锁定和同步方法,以找出最适合 svn 的方法。当涉及到线程同步时,这是一个很好的资源: http: //effbot.org/zone/thread-synchronization.htm

Q3:有没有任何工具/策略来调试此类问题?

当然,线程和多处理都应该具有可以与日志记录结合使用的日志记录功能。我只是记录到一个文件,以便您可以参考一些内容,而不仅仅是控制台输出。从理论上讲,您应该能够使用logging.debug(pool.map(logrun, _commands))并记录所采取的过程。话虽这么说,我不是线程或多处理方面的日志记录专家,所以其他人可能会比我更好地回答这个问题。

您使用的是 Python 2.x 还是 3.x?