python popen阻塞_记一次 Python Popen 阻塞的问题

文章讲述了在Python中使用Popen时遇到的阻塞问题,问题出现在父进程的Popen操作与子进程对同一管道的处理之间存在并发冲突。通过Pylane Shell分析发现,子进程在fork后继承了管道,导致父进程在关闭写端后,读端仍然被子进程持有,造成读取阻塞。解决方案是梳理线程和子进程的依赖,确保在干净的环境下fork。
摘要由CSDN通过智能技术生成

Valens

网易游戏运维与基础架构部 产品软件设计师 专注于智能监控、性能优化等领域

背景

在一次更新中,我们的 Python Agent 增加了一个新的子进程。上线后发现,主进程中,监控该子进程的插件线程小概率会被阻塞,阻塞点的调用函数为subprocess.Popen,逻辑为跑一个ss命令采集本地连接情况。

现场

拿到一个保留现场后,简单查看下,父进程子进程状态都比较正常。二话不说先用 Pylane Shell 打进去,看看阻塞的线程在干嘛:

1In [25]: tools.print_threads(["pusher_keep_alive"])

2Out[25]:

3

4Thread: pusher_keep_alive

5Stack:

6......

7 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/libase/multirun/common.py", line 237, in run_cmdline_with_file

8 env=env,

9 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/subprocess32.py", line 825, in __init__

10 restore_signals, start_new_session)

11 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/subprocess32.py", line 1537, in _execute_child

12 part = _eintr_retry_call(os.read, errpipe_read, 50000)

13 File "/usr/local/gpostd_virtualenv/local/lib/python2.7/site-packages/subprocess32.py", line 546, in _eintr_retry_call

14 return func(*args)

15

16Locals:

17 {'args': (18, 50000), 'func': }

18

卡在了 subprocess32 库调用 os.read 的地方,关键代码:

11330 def _execute_child(self, args, executable, preexec_fn, close_fds,

2..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值