Python Pool 用进程池多进程下载git 代码时hang 在read系统调用上。
我用Python多进程来clone git 代码,其中多进程的实现使用了Python Pool
,一般情况下可以顺利的下载所有的代码,但是当存在其中某一个代码仓库的代码量远远大于其他代码仓库时,clone最大代码仓库的子进程会hang在git-lfs
上,使用strace
命令来追踪该git
进程,可以看到它卡在read
系统调用上。
Process 27649 attached
read(6, 0x7ffc36dae050, 4) = ? ERESTARTSYS (To be restarted if SA\_RESTART is set)
--- SIGALRM {si\_signo=SIGALRM, si\_code=SI\_KERNEL, si\_value={int=2895997, ptr=0x2c307d}} ---
rt\_sigreturn() = 0
read(6, 0x7ffc36dae050, 4) = ? ERESTARTSYS (To be restarted if SA\_RESTART is set)
--- SIGALRM {si\_signo=SIGALRM, si\_code=SI\_KERNEL, si\_value={int=2895997, ptr=0x2c307d}} ---
rt\_sigreturn() = 0
read(6, 0x7ffc36dae050, 4) = ? ERESTARTSYS (To be restarted if SA\_RESTART is set)
--- SIGALRM {si\_signo=SIGALRM, si\_code=SI\_KERNEL, si\_value={int=2895997, ptr=0x2c307d}} ---
rt\_sigreturn() = 0
read(6, 0x7ffc36dae050, 4) = ? ERESTARTSYS (To be restarted if SA\_RESTART is set)
--- SIGALRM {si\_signo=SIGALRM, si\_code=SI\_KERNEL, si\_value={int=2895997, ptr=0x2c307d}} ---
rt\_sigreturn()
我的多进程实现代码如下。
p = Pool(processNum)
LogInfo('Parent process %s.' % os.getpid())
multi_res = [p.apply_async(runfunc, args=(
incl_info, project_root, skip_dirs,)) for incl_info in incl_infos]
LogInfo('Waiting for all subprocesses done...')
p.close()
p.join()
# 处理返回信息
resMesList = []
for res in multi_res:
resMes = str(res.get())
if (resMes.find("Failed") != -1):
#LogErr("Please check the password.")
resMesList.append(resMes)
处理函数子进程只是新启动一个shell中git clone
的subprocess.
def runfunc(incl_info,project_root,skip_dirs):
if incl_info == 0:
git_url = project_root["git_url"]
dir_path = project_root["dir_path"]
GitCloneInShell(git_url,dir_path)
def GitCloneInShell(git_url,dir_path):
cmd = ("git clone %s %s " % (git_url, dir_path))
LogInfo("git clone cmd : %s" % cmd)
status = subprocess.call(cmd, shell=True)
return status
猜想是否是因为子进程的输出缓冲区被沾满了,状态转换为wait
?但是不太清楚该如何去修改。请问有遇到类似情况的朋友吗,求助。谢谢啦!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论