python subprocess popen_python 并发subprocess.Popen的坑

当在Python中并发使用subprocess.Popen时,可能会遇到子进程创建延迟的问题,原因是fd被多个子进程同时继承。通过设置Popen的`close_fds=True`参数,确保每个子进程不继承不必要的fd,从而避免该问题。本文介绍了问题的产生、复现代码、运行环境以及解决方案。
摘要由CSDN通过智能技术生成

表现

一个父进程里多个线程并发地调用 subprocess.Popen 来创建子进程的时候, 会有几率出现 Popen 长时间不返回的情况.

这个问题是由于fd被多个子进程同时继承导致的.

重现问题的代码

下面这个小程序启动2个线程, 每个线程各自(通过 subprocess.Popen )启动一个子进程, 一个子进程执行 echo 1 后就直接返回; 另一个子进程启动后, sleep 0.03 秒后返回.

程序里统计了2个调用 Popen 花的时间, 运行后可以发现, echo的进程有时启动很快(小于预期的0.01秒, 仅仅是启动, 不包括执行时间), 有时会很慢(超过0.03秒), 刚好和另一个sleep的进程执行时间吻合. 调大sleep子进程的时间可以看到echo也会同样有几率返回慢.

# > cat slow.py

import threading

import subprocess

import time

def _open(cmd, expect):

t0 = time.time()

proc = subprocess.Popen(

cmd,

shell=True,

# # without this line, some Popen does not return at once as expected

# close_fds=True,

stderr=subprocess.PIPE,

stdout=subprocess.PIPE)

spent = time.time() - t0

if spent > expect:

print cmd + ' spent: ' + str(spent)

pro

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值