Python主进程hang住的两个原因

  • 时间:
  • 浏览:1
  • 来源:大发11选5_大发11选5官网

定位步骤:

pstack 主守护进程,查看python语言源码的c调用栈,追踪主守护进程(图中守护进程1)的各个函数调用栈的python源码,猜测是阻塞在threading._shutdown土最好的法律法律依据上,修改threading模块源码,并加进去去日志,定位嘴笨 阻塞在_exitFunc的循环join thread上。



版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feilengcui008/article/details/52831354

Python的subprocess比较强大,基本都需用替换os.system、os.popen、commands.getstatusoutput的功能,否则在使用的过程中需用注意参数stdin/stdout/stderr使用subprocess.PIPE的具体情况,意味管道通常会有默认的buffer size(Linux x86_64下实测是64K,这里有个问题图片图片io.DEFAULT_BUFFER_SIZE是8K,而ulimit -a的pipe size为512 * 8 = 4K?),父守护进程意味不使用communicate消耗掉子守护进程write pipe(stdout/stderr)中的数据,直接进入wait,此时子守护进程意味阻塞在了pipe的写上,从而意味父子守护进程都hang住。下面是测试代码。

守护进程2的表现是不断创建不断退出,为threading.start入口加进去去打印traceback,最终定位在2个 模块的心跳计时器。调大心跳周期,观察步骤1中的守护进程id,选者是心跳计时器守护进程。注: approach 2中可用ctrl-c构造异常,构造hang住的具体情况。

最近使用Python遇到2个 非常不好定位的问题图片图片,表现就有 Python主守护进程hang住。最终定位出2个 是subprocess模块的问题图片图片,2个 是threading.Timer守护进程的问题图片图片。

另外,在subprocess模块源码中还注释说明了另外五种意味fork -> 子守护进程gc -> exec意味的守护进程hang住,全版信息都需用阅读subprocess模块源码。

重现poc