【发布时间】:2014-12-29 10:54:36
【问题描述】:
我正在编写一个程序来并行运行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)
argv.jobcount 是multiprocessing.cpu_count() 和要运行的作业数(在本例中为 4)中的较小值。 _commands 是包含下面列出的命令的字符串列表。 shell 在 Windows 上设置为 True,因此 shell 可以找到可执行文件,因为 Windows 没有 which 命令,并且在 Windows 上查找可执行文件有点复杂(命令过去的形式为 @ 987654335@ 也需要 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
每个文件夹是一个单独的项目/存储库,但存在于同一个 Subversion 服务器上。 svn 可执行文件是使用 TortoiseSVN 1.8.8(构建 25755 - 64 位)打包的。代码是最新的(即svn up 是无操作的)。
当客户端死机时,任务管理器中的内存条首先变为空白:
有时一切都会变暗
如果我等待一段时间(几分钟),机器最终会恢复正常。
Q1:并行调用svn 会不会很尴尬?
Q2:我使用ThreadPool.map() 和subprocess.Popen() 的方式有什么问题吗?
Q3:是否有任何工具/策略可以调试此类问题?
【问题讨论】:
-
我建议不要将多个问题打包成一个问题(或者这样做不太明显),您只会从知道所有问题答案的人那里得到答案。
-
感谢您的反馈。我的 Qn 列表是同一个问题的所有方面(即,如果您不能并行调用
svn,那么我如何称呼TP.map()并不重要),但当然,如果有人只知道部分答案那么请回答(我给所有有用的答案加分)。 -
使用
logging,查看脚本中发生了什么。在 Windows 上使用iotop的模拟来查看您的磁盘发生了什么。您可以安装类似glances和/或Sysinternals tools 的东西。然后使用标准调试技术:阅读代码 测试你的理解程度 缩小问题范围。为什么使用shell=True运行svn? (subprocess可以找到svn没有shell=True的可执行文件吗?) -
_commands' 是什么类型?你的 Python 版本是什么?argv.jobcount有多大?捕获异常并记录它们。 -
@J.F.Sebastian 我已经用
Popen参数的信息更新了这个问题。我现在正在研究您的工具建议。 (谢谢)