多处理池挂起

Posted

技术标签:

【中文标题】多处理池挂起【英文标题】:multiprocessing Pool hangs 【发布时间】:2020-04-11 15:18:30 【问题描述】:

我创建了一个池来使用 Gitpython 进行 git clone。有一个大的 git repo 并且需要比其他人更多的时间来克隆。每个进程为一个 repo 做一个克隆工作。我使用的Pool如下:

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...')
for i in range(len(incl_infos)):
    while not multi_res[i].ready():
        LogInfo("Downloading now")
        time.sleep(5)
p.close()
p.join()

它在大多数情况下都能完美运行。但是会经常挂在最大的repo中。当我单独克隆回购时,它是有线的,它工作正常。所以我想知道python multiprocessing.Pool中是否有一些块。

我已经 strace 挂起的 git clone 进程。 git进程输出如下:

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

git-lfs 输出如下:

Process 28006 attached
[ Process PID=28006 runs in 32 bit mode. ]
futex(0x88b982c, FUTEX_WAIT_PRIVATE, 0, NULL

等待您的帮助。

【问题讨论】:

【参考方案1】:

好的,我找到了原因。这是因为我使用了gitpython lib,它有时会挂起。

【讨论】:

以上是关于多处理池挂起的主要内容,如果未能解决你的问题,请参考以下文章

多处理池挂在 jupyter 笔记本中

python多处理pool.map挂起

Pybind11 多处理挂起

Python多处理池在加入时挂起?

当多处理进程打开另一个进程时程序在调试中挂起

当脚本在多处理工作人员中运行异步事件循环时,通过子进程运行脚本会挂起