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.jobcount
是multiprocessing.cpu_count()
运行的作业的较小者和数量(在这种情况下是4). _commands
是一个字符串列表,其中包含下面列出的命令. 在Windows上shell
设置为True
shell,因此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?